redis【如何保证缓存与数据库双写时的数据一致性?】

一般并发下

上万人并发操作的读写如下:

存在的问题:

遇到写请求时,可用先删除缓存数据,再更新数据库,这样不管数据库更新失败还是缓存删除失败,缓存与数据库始终一致。这种方案一般可满足上万人并发操作了,因为删除缓存到更新数据库的时间可以用毫秒计算,正常的并发影响不大。但如果是达到上亿级访问,在这时间段内,会出现读请求在写请求更新数据库之前执行,导致数据库与缓存不一致

亿级并发

场景

淘宝双11活动,抢购商品,商品数量为100,当前状态是数据库和缓存都是100,这时上亿账户抢购该商品,商品数量要减少。一个消费者A抢购成功,这时应该删除缓存,更新商品数量,在更新商品数量之前,又有一个消费者B来查看该商品数量,由于缓存清空,到数据库查询,该消费者查看到的是商品数量为100,并更新缓存为100,其实商品数量已经被消费者B抢购成功之后,数据库中商品数量更新为99了,缓存与数据库数据不一致

解决方案1:读写分离

读写分离:读请求只访问缓存,写请求只修改数据库和缓存

写请求修改数据库和缓存是事务性动作,如果更新数据库成功,更新缓存失败,则回滚数据库,保证缓存与数据库数据强一致。这样实现了读写分离,不仅提高了读的响应速度,由写请求负责缓存与数据库一致,只有写请求成功才会影响到缓存的内容,时效性大大增强

解决方案2:队列存储请求

添加队列,凡是遇到写请求,则将写请求放入队列中,由队列对写请求统一管理,写请求处理成功,则从队列中删除。当有一个读请求过来时,到队列查询,是否有对应的写请求,如果有则放入队列中,等待写请求执行完之后再执行读请求。为防止某个请求阻塞情况,为其设置超时机制或者过期机制。

这种方案虽可行,但是倘若访问量大,处理器来不及处理,队列内的请求数量越来越高,则会影响查询效率。出现这种情况,就要加机器集群执行,帮忙分担压力

参考:https://www.cnblogs.com/williamjie/p/11287317.html

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值