redis和数据库如何保持强一致性 (redis做缓存如何保证数据的一致性)

PS:创作不易,感谢阅读,希望对读者有所帮助,喜欢的话可以点赞、收藏、关注,作者会持续更新 Java 生态圈常见知识。黑色加粗为重点关注内容!

访问串行化(推荐)

  • 特点是强一致性、高并发
  • 核心思想
    • 若缓存有更新,后续的查询一定要等待【更新结束后】才执行
  • 原理
    • 创建一个有序队列
    • 若缓存有更新,则先删除缓存,将【更新数据库和缓存】的操作,放入有序队列中
    • 若后续查不到缓存,则将查询操作放入有序队列中;
    • 此时,有序队列中,查询操作一定在【更新数据库和缓存】的操作之后
  • 问题
    • 读请求积压,大量超时,可能导致数据库压力,从而发生限流或熔断
  • 优化:
    • 将有序队列水平拆分,如按业务拆分为多个队列,提高并行度
    • 保证相同的key请求路由正确

异步更新缓存(推荐)

这种方案对研发人员来说比较轻量,不用关心缓存层面,而且这个方案虽然比较重,但是却容易形成统一的解决方案。

如何保证redis缓存和数据库一致性,redis缓存和数据库一致性问题解决

  • 特点是基于 binlog 的同步机制、高并发、最终一致性
  • 原理
    • 数据直接写到数据库中。
    • 数据库会更新 binlog 日志。
    • 利用 Canal 读取 binlog 日志。
    • Canal 借助于限流组件将数据发到消息队列中。
    • 应用监听消息队列通道,将数据更新到 Redis 缓存中。