库存是先删缓存还是先改db
先改db再淘汰缓存
- 缓存失效
- A读db数据是旧值
- B改数据并淘汰缓存
- A写入旧值到缓存中
此种方案,发生的问题的条件比较苛刻,但也会出现此类问题
先淘汰缓存再改db
- B淘汰缓存
- A读取缓存,没值,去读取旧值
- B修改DB
- A把旧值写到缓存中
此种方案,只要有读取事件在B淘汰后修改成功前出现,则会出现严重的脏读问题,需要一直等到缓存失效才会解决问题
延迟双删
对于此问题,我们常用解决方案是延迟双删
- 先删除缓存
- 修改db
- 休眠x ms再淘汰缓存
休眠x的目的是为了在修改db时,让出现的读事件写缓存的过程执行完.
为了防止淘汰缓存失败,还需要增加重试机制(mq实现)
为了增加吞吐量,可以把休眠ms放在协程中实现
读写分离主从情况下,休眠时间可以延长一点
网友评论