(10)先删缓存,还是先更新DB?(2)

2020-11-06  本文已影响0人  hedgehog1112

一、先删缓存,再更新数据库(用得少)

双删三次操作不能保证原子性,所以很少用

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

上一篇 下一篇

猜你喜欢

热点阅读