数据库和redis缓存一致性

本文探讨了在高并发环境下,如何处理数据库与Redis缓存一致性问题,包括先删缓存再改数据库、先改数据库再删缓存、设置过期时间和使用binlog同步等策略,并分析了各种方案的优缺点以及适用场景。分布式锁和事务框架也被提及作为解决一致性问题的方法。
摘要由CSDN通过智能技术生成

如果在高并发修改的场景,会存在redis和MySQL数据不同步的问题。

比如,修改某个商品的价格,
第一种情况:
可以先把缓存删掉,然后修改MySQL商品价格。然鹅,MySQL商品价格还没来得及修改,另外一个读商品的请求过来了,redis没读到,就会读MySQL的老数据,并加载到redis。过了一会,第一个请求把MySQL的商品价格修改成功了,就会导致两边数据不一致的情况。
第二种情况:
先修改MySQL商品价格,再删缓存,MySQL价格修改了,缓存删除失败了,就会导致不一致的情况。

解决方案:

  1. 延时双删:delete key -> update MySql -> thread.sleep(1s) -> delete key
  2. 设置过期时间 -> update MySql -> delete key
  3. binlog同步到redis
  4. 加分布式锁
  5. 事务框架处理

对方案1的理解:
请求1先删除key,另外一个读请求,2进来了,发现没有缓存,就去从MySQL获取老数据,并加载到redis,这时请求1把MySQL更新了,然后再次删除缓存。为什么还要加个延时呢,因为存在这样一种情况,请求2去加载缓存之前,请求1已经删除了缓存,所以要等待至少完成一次读的时间,同时也得考虑redis和数据库主从同步(读从从库读)的耗时,一般几百ms,等待这两个时间之和再完成key的delete。

对方案2的理解:
这个就好说了,先把这个k

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值