Redis数据库双写不一致问题

缓存+数据库读写模式

设计过程

  1. 请求读数据,先读缓存,缓存没有则读数据库。
  2. 更新数据库数据,在删除缓存。
  3. 再次读取数据时候,在计算缓存数据(用缓存在算缓存(lazy))。

上述过程,如果在删除缓存的时候失败,会导致当前缓存的是旧数据(与数据库不一致)。

过程修改1

  1. 读数据,先读缓存,缓存没有则读数据库。
  2. 先删除缓存,然后在更新数据库数据。
  3. 再次读取数据时候,在计算缓存数据。

上述过程,在产生读写并发时,会出现:请求A正在跟新数据,处于缓存删除了且数据库没有更新阶段,此时有另外一个读请求B,请求数据,从缓存中发现数据为空,从数据库获取数据并新建缓存,此时的缓存是旧数据(A请求的修改数据之前)。

过程修改2

  1. 新建队列,用于该缓存在没有缓存的时候,将更新读请和后面的读请求串行化执行。
  2. 将更新请求放入队列中。等待执行。
  3. 读请求,先读缓存,缓存没有,则将读请求(附带写缓存操作)放入队列中(如果队列最后一个是读请求,就可以让次请求等待200ms(不添加到队列中且不做写缓存操作),避免后面读请求串行化执行,导致请求处理过慢),等待执行。
  4. 队列先进先出,先处理修改请求,删除缓存,修改数据库。
  5. 在处理读缓存,读取数据库后新建缓存。

注意:以上是在单服务的情况下,在分布式服务中要使用分布式队列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值