1、什么是延迟双删?
延迟双删策略是分布式系统中数据库存储和缓存数据保持最终一致性的常用策略,但它不是强一致。其实不管哪种方案,都避免不了Redis存在脏数据的问题,只能减轻这个问题,要想彻底解决,得要用到同步锁和对应的业务逻辑层面解决。
2、为什么要进行延迟双删?
一般我们在更新数据库数据时,需要同步redis中缓存的数据,所以存在两种方法:
第一种方案:先更新数据库,再删除redis。
第二种方案:先删除redis,再更新数据库。
这两种方案的弊端是当存在并发请求时,很容易出现以下问题:
第一种方案:当请求1执行完更新数据库操作后,还未来得及删除redis,此时请求2查询到并使用了redis中的旧数据。
第二种方案:当请求1执行完删除redis后,还未进行更新数据库操作,此时请求2查询到了数据库的旧数据并写入了redis。
3、如何实现延迟双删?
所以此时我们需要使用第三种方案:先删除redis,再更新数据库,延迟N秒后再删除一次redis。
4、需要注意的点
上述中(延迟N秒)的时间一定要大于请求2将数据库旧数据写入redis的时间,这个时间短则几百毫秒,长则几秒,具体根据自己的业务而定。
原因:如果延迟时间小于请求2写入redis的时间,会导致请求1清除缓存的时机过早,请求2又会将旧的数据写入redis的尴尬。。。
5、小结
- 延迟双删用比较简洁的方式实现 mysql 和 redis 数据最终一致性,但它不是强一致。
- 延迟,是因为 mysql 和 redis 主从节点数据同步不是实时的,所以需要等待一段时间,去增强它们的数据一致性。
- mysql 和 redis 数据一致性是一个复杂的课题,通常是多种策略同时使用,例如:延迟双删、redis 过期淘汰、通过路由策略串行处理同类型数据、分布式锁等等。