一、先删缓存,再更新数据库(用得少)
双删三次操作不能保证原子性,所以很少用
1、普通不一致原因:
(1)A写,删缓存
(2)B查,缓存不在
(3)B去DB查询得旧值
(4)B将旧值写缓存(如果不用过期策略,永远脏)
(5)A新值写DB
解决1:延时双删策略,可将1秒内缓存脏数据,再次删除
2、mysql读写分离不一致:
(1)A写,删缓存
(2)B查询缓存,空
(3)B去从库查,未完成主从同步,查到旧值
(4)B将旧值写入缓存
(5)主从同步,从库变为新值
用双删延时策略,睡眠时间加几百ms
1)用这种同步淘汰策略,吞吐量降低怎么办?
第二次异步删除。不用沉睡,再返回。加大吞吐量。
2)第二次删除,如果删除失败怎么办?
看第(3)种更新策略的解析。
二、先更新数据库,再删缓存(用得多)
并发问题:(1)缓存刚好失效
(2)A查询得旧值
(3)B新值写入db
(4)B删除缓存
(5)A将查的旧值写入缓存
这一情形很难出现:产生脏数据,先天性条件(3)比(2)耗时更短,才让(4)先于(5)
有强迫症,一定要解决怎么办?
先给缓存设有效时间,策略1异步延时删除策略,保证读完再删除(4.5颠倒)
三、删缓存失败怎么办
下面方案更好
https://www.cnblogs.com/rjzheng/p/9041659.html#!comments
网友评论