上一篇文章提到了2个观点:
最终一致性
。同时提到了数据更新的时候,删除缓存和更新DB,哪个操作应该先行了?
本文同上一篇文章一样,假设在不为缓存添加过期时间极端情况下,进行思考。
假如:A线程在对数据X
进行更新操作,B线程在对数据X
进行查询操作。
数据X
的缓存数据X
进行查询,发现缓存已经不存在,于是重新建立当前DB数据的缓存。数据X
进行DB的更新。上述 1 --> 2 --> 3 是按照时间线进行的,大家发现问题没?
因为写数据库的耗时比查询和建立缓存更耗时,所以该情况发生的概率有的。
第2步建立的缓存还是老数据的缓存,第三步才是对数据进行的更新。
那么有办法解决这个问题吗?我认为只能避免,在不加缓存过期时间的情况下无法解决。
有一个避免
(不是解决)的办法是在上述步骤后再加一个步骤4:删除缓存
即使在这个过程中,有查询操作建立了缓存,对其进行删除操作应该也能避免脏数据吧。表面来看确实如此,但是细细分析,确还是有问题,再加入了第4步二次删除缓存的情况下,进行如下操作:
数据X
的缓存数据X
进行查询,发现缓存已经不存在,准备建立当前DB数据的缓存(还没开始,只是准备)。数据X
进行DB的更新。通过直接进行二次删除也会有问题。
那么继续分析,我再进行二次删除前睡眠一段时间,待2步骤准备建立缓存的操作结束。这个方案理论上是可以的,但是你告诉我,睡眠多长时间?
综上:即使通过2次删除缓存也没有很好的解决此问题。
正如小标题后方括号的标注而言,这个方案是我最推荐的方案:先更新DB,再删除缓存。
先更新DB,在还没有删除的这段时间内,即使有操作读取到了缓存中的脏数据,那也只是一时的,因为随后肯定会对缓存进行删除。
该方案在没有缓存过期时间的情况下,应该是最优的方案了。
其实该方案同样存在问题:
因为写数据操作比缓存建立耗时,所以该情况发生的概率很小。
为了保证缓存的一致性,该方案只需要保证删除缓存成功即可:
方案很多,不再一一列举。