https://blog.csdn.net/huizhi2533/article/details/107021249/
缓存为啥是删除,而不是更新?
如果是更新,存在分布式事务问题,可能出现修改了缓存,数据库修改失败的情况。只是删除缓存的话,就算数据库修改失败,下次查询会直接取数据库的数据,也不会出现脏数据。
延时双删是什么?
就是在增删改某实体类的时候,要对该实体类的缓存进行清空,清空的位置在数据库操作方法的前后。
采用反证法
只先删
只后删
结论
从而得出 前删和后删都有问题。所以采用延时双删的策略
思考2:为啥是延时
依然是反证法。下图这情况是双删依然存在旧缓存的情况,延时是确保 修改数据库-》清空缓存前,其他事务的更改缓存操作已经执行完。
延时双删策略
写DB前后都执行redis.del(key)
,并设定合理超时时间。
执行流程
- 先删除缓存
- 再写数据库
- 休眠xx毫秒(根据具体业务时间)
- 再次删除缓存
xx毫秒怎么确定?
需要评估项目读数据业务逻辑耗时,以确保读请求结束,写请求可删除读请求造成的缓存脏数据。
该策略还要考虑 redis 和数据库主从同步的耗时。最后的写数据的休眠时间:则在读数据业务逻辑的耗时的基础上,加上几百ms即可。比如:休眠1秒。
l思考: 当然,这里有一个问题,如果B,C事务,都在A事件更新数据库执行,就可能这一小段时间内有脏数据!