redis缓存更新策略

文章讨论了在Redis缓存系统中,先删除缓存再更新数据库以及先更新数据库再删除缓存两种策略的缺陷。为了解决这些问题,提出了延迟双删方法,即先清除缓存,延迟一段时间后再次清除,以防止旧数据被写回。同时提到了缓存删除失败时的重试机制和通过订阅MySQLbinlog来自动更新缓存的方案。
摘要由CSDN通过智能技术生成
参考地址redis延时双删第一个删除是为了什么? - 知乎

https://www.ngui.cc/el/3080262.html?action=onClick

 

可能有两种方案:

1.先删缓存,后更新数据库

2.先更新数据库,后删缓存

第1种的缺陷:删了缓存,另一个请求来查,发现缓存为空,查到旧数据保存到缓存中。

第2种的缺陷:从更新数据库到删缓存的时间内,查询到的缓存为旧数据,也就是造成查询延迟。

其实第二种是可以接受的。不过有一种少见的极端情况,即缓存到期,读请求先来然后延迟,导致写入旧数据。

至于为什么不是先更新数据再更新缓存。因为更新缓存可能因为线程切换等延迟导致旧请求的数据覆盖新数据。而且每次都更新缓存可能导致浪费资源。        先更新缓存再更新数据就更不可以了。因为可能导致更新数据库失败回滚,但缓存没办法回滚。

延迟双删

为了解决这两种方案的缺陷,可以使用延迟双删,即先进行缓存清除,再执行update,最后(延迟N秒)再执行缓存清除。进行两次删除,且中间需要延迟一段时间。

延迟删就是为了解决方案1的缺陷,即其他请求查到了旧数据,并写入缓存。本请求要等其写完缓存后再删除掉它。因此延迟时间应该大于该写入请求的时间。

删缓存失败

重试机制

可以将删除失败的缓存写入重试表,用定时任务如elastic-job定时重试。

可以将删除失败的缓存发到mq,由消费者进行重试。

订阅binlog

这种方案可以不在业务中关心缓存处理,而是直接订阅mysql的binlog日志,发现有数据更新,就删除对应缓存。可以使用canal中间件订阅。当然也要加上重试机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值