Redis双写一致性

先更新数据库,再更新缓存场景-不推荐

当有两个线程A、B,同时对一条数据进行操作,一开始数据库和redis的数据都为1,当线程A去修改数据库,将1改为2,然后线程A在修改缓存中的数据,可能因为网络原因出现延迟,这个时候线程B,将数据修改成了3、然后将数据库中的1也改成了3,然后线程A恢复正常,将redis中的缓存改成了2,此时就出现了缓存数据和数据库数据不一致情况。不推荐

image.png

先更新缓存,再更新数据库场景-不推荐

当有两个线程A、B,同时对一条数据进行操作,线程A先将redis中的数据修改为了2,然后CPU切换到了线程B,将redis中的数据修改为了3,然后将数据库中的信息也修改了3,然后线程A获得CPU执行,将数据库中的信息改为了2,此时出现缓存和数据库数据不一致情况。不推荐

image.png

先删除缓存,再更新数据库的场景-不推荐

当有两个线程A、B,同时对一条数据进行操作,当线程A进行修改缓存操作时,先删除掉缓存中的数据,然后去修改数据库,因为网络问题出现延迟,这时线程B查新redis没有值,因此去数据库中查询数据为1,然后将数据1更新到缓存中,线程A网络恢复,又将数据库数据修改为了2,此时出现数据不一致。不推荐

image.png

先更新数据库,在删除缓存场景-可以接受

一改一查场景

当有两个线程A、B,线程A先去将数据库的值修改为2,然后需要去删除redis中的缓存,当线程B去读取缓存时,线程A已经完成delete操作时,缓存不命中,需要去查询数据库,然后在更新缓存,数据一致性;

如果线程A没有完成delete操作(图中案例),线程B直接命中,返回的数据与数据库中的数据不一致,可能会短暂出现数据不一致情况,但最终都会一致。推荐

image.png

存在的问题

当数据过期或者初始化时,会出现数据不一致情况,也就是线程B从数据库中,查询到数据为tony,然后线程A将tony修改为了allen,然后去删除redis中的数据,然后线程B将读到的tony,更新到了数据库中,出现了数据不一致问题。

image.png

 

解决方案

对于不过期的数据我们要在上线的时候做好数据的预热,保证缓存命中。对于存在过期的数据,因为有过期时间,只会在特定的时间段内数据不一致,下次数据过期后,可以恢复,对于实时性要求不高时,可以接受。

两次修改场景

当有两个线程A、B,线程A去修改数据库中的值改为2,然后出现网络波动,线程B将数库中的值修改为了3,然后两个线程都会删除缓存,保证数据一致性。无非是线程A多删了一次。

image.png

最佳实现,数据异步同步

Canal:基于数据库增量日志解析,提供增量数据订阅和消费https://github.com/alibaba/canal

mysql会将操作记录在Binary log日志中,通过canal去监听数据库日志二进制文件,解析log日志,同步到redis中进行增删改操作。

canal的工作原理:canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议;MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal );canal 解析 binary log 对象(原始为 byte 流)。

111.png

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Redis双写一致性是指在数据库Redis缓存中同时进行写操作时,确保数据的一致性。在双写一致性中,存在几个常见的问题,包括缓存雪崩、缓存穿透和缓存并发竞争等。 缓存雪崩是指在某个时间点,大量缓存失效导致请求直接落到数据库上,造成数据库压力骤增。为了避免缓存雪崩,可以采用设置不同的过期时间或使用互斥锁机制来保证缓存的稳定性。 缓存穿透是指恶意或非法请求查询缓存中不存在的数据,导致大量请求落到数据库上,增加数据库的负载。为了解决缓存穿透问题,可以使用布隆过滤器等技术来过滤掉无效请求。 缓存并发竞争是指多个线程同时对同一个缓存进行写操作,可能导致数据不一致的问题。为了保证缓存一致性,可以采用延时双删策略,在写数据库之前删除一次缓存,在写完数据库后,间隔一段时间再删除一次缓存。这样可以增加缓存删除的可靠性和容错性。 另外,要保证Redis双写一致性,还可以通过配置Redis策略来进行优化和控制。根据实际情况选择合适的策略,例如使用缓存更新策略或读写分离策略等,以提高系统的性能和可靠性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [总结redis实战解决方案](https://download.csdn.net/download/zxfmamama/85931055)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Redis缓存双写一致性问题](https://blog.csdn.net/wzngzaixiaomantou/article/details/126879335)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大将黄猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值