首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >探讨缓存一致性问题(读写缓存)

探讨缓存一致性问题(读写缓存)

原创
作者头像
不做虫子
发布2025-09-09 09:44:23
发布2025-09-09 09:44:23
1920
举报

读写缓存:增删改在缓存中进行,并采取相应的回写策略,同步数据到数据库中

前言

读写缓存是指增删改在缓存中进行,并采取相应的回写策略,同步数据到数据库中。其中回写策略有两种:

  • 同步回写:利用原子性、事务等保证缓存和数据库更新的一致性
  • 异步回写:更新完缓存后不回写数据库,等缓存被淘汰时才写回(常见于秒杀场景)。当Redis发生故障时,会造成较大损失。

就一致性而言,同步回写显然是一致性比较强的,但是同步回写这里同样会遇到时序的问题。

先更新缓存再更新数据库

无并发

如果先更新缓存后更新数据库可能遇到更新数据库失败的问题,就会造成数据的不一致。

解决方法:

  • 消息队列+重试
  • 设置过期时间

并发读写

并发读写情况下,没有太大问题,针对user1来说,读时还没更新完数据库,这时数据存在短暂的不一致;但是对user2来讲并无感知。

并发写写

并发写写情况下,user1更新完缓存后还未更新数据库,结果user2率先完成两个步骤,user1再次更新数据库,导致缓存中的值和数据库中的值不一致,会对业务造成较大影响。

解决方案:

  • 分布式锁

先更新数据库再更新缓存

无并发

先更新数据库后更新缓存失败的情况,会导致两边数据存在不一致,后续请求都会读取到旧的数据,对业务造成影响。

解决方案:

  • 消息队列+重试
  • 订阅binlog

并发读写

并发读写时,user1还未更新缓存,其他请求就已经读取到了旧值,会导致一定时间内数据不一致,对业务有短暂的影响。

解决方案:

  • 可以保存缓存的读取记录,并和数据库做比较,做补偿

并发写写

此种情况和先更新缓存再更新数据库的写写场景类似,会造成数据不一致,都会对业务造成较大影响。

解决方案:

  • 分布式锁

小结

现实业务错综复杂,各种状况都有可能发生,无论只读缓存和读写缓存,分析的关键在于穷尽所有可能发生的情况,并仔细考虑其应对策略。

一般来说,选定缓存方案的步骤如下:

  1. 确定缓存类型(只读 or 读写)
  2. 确定一致性级别
  3. 确定同步方式(同步 or 异步)
  4. 确定缓存流程
  5. 补充细节

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 先更新缓存再更新数据库
    • 无并发
    • 并发读写
    • 并发写写
  • 先更新数据库再更新缓存
    • 无并发
    • 并发读写
    • 并发写写
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档