什么是延迟双删?
做法:先删除redis,再更新数据库,延迟N秒后再删除一次redis。
延迟双删策略是分布式系统中数据库存储和缓存数据保持最终一致性的常用策略,但它不是强一致。
其实不管哪种方案,都避免不了Redis存在脏数据的问题,只能减轻这个问题,要想彻底解决,得要用到同步锁和对应的业务逻辑层面解决。
在更新数据库数据时,需要同步redis中缓存的数据,存在两种方法:
第一种方案
先更新数据库,再删除redis。
存在的问题:当请求1执行完更新数据库操作后,还未来得及删除redis,此时请求2查询到并使用了redis中的旧数据。
第二种方案
先删除redis,再更新数据库。
存在的问题:当请求1执行完删除redis后,还未进行更新数据库操作,此时请求2查询到了数据库的旧数据并写入了redis。
所以需要先删除redis,再更新数据库,延迟N秒后再删除一次redis。
延时双删可能会导致的问题?
在低并发的情况下,可以通过加锁的方式来达成双写一致性。
但是高并发的情况下,删除缓存必然会造成缓存击穿的问题,其实缓存击穿影响不大,因为能解决, 主要是延迟双删的第一次删除可能没什么意义。
因为在缓存第一次删除旧数据后,数据库还没有完成更新时,请求到来时直接请求数据库,返回的还是旧数据并添加到了缓存中,相当于又回到了缓存第一次删除之前的状态,都是缓存的旧数据。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持IT俱乐部。