所谓延迟双删,其实是:
1、先删除缓存
2、更新数据库
3、删除缓存
第一次删除的作用
第一次之所以要选择先删除缓存,而不是直接更新数据库,主要是因为先写数据库会存在一个比较关键的问题,那就是缓存的更新和数据库的更新不是一个原子操作,那么就存在失败的可能性。
如果写数据库成功了,但是删缓存失败了!那么就会导致数据不一致。
而如果先删缓存成功了,后更新数据库失败了,没关系,因为缓存删除了就删除了,又不是更新,不会有错误数据,也没有不一致问题。
并且,相对于缓存和数据库来说,数据库的失败的概率更大一些,并且删除动作和更新动作来说,更新的失败的概率也会更大一些。
所以,为了避免这个因为两个操作无法作为一个原子操作而导致的不一致问题,我们选择先删除缓存,再更新数据库。这是第一次删除缓存的原因。
"读写并发"的问题会导致并发发生后,缓存中的数被读线程写进去脏数据,那么就只需要在写线程在删缓存、写数据库之后,延迟一段时间,再执行一把删除动作就行了。
这样就能保证缓存中的脏数据被清理掉,避免后续的读操作都读到脏数据。当然,这个延迟的时长也很有讲究,到底多久来删除呢?一般建议设置1-2s就可以了。
当然,这种方案也是有一个弊端的,那就是可能会导致缓存中准确的数据被删除掉。当然这也问题不大,就像我们前面说过的,只是增加一次cache miss罢了。
所以,为了避免因为先删除缓存而导致的”读写并发问题“被放大的情况,所以引入了第二次缓存删除。
评论区