数据库和缓存保持一致性常用的方式有以下四种:
1、先更新数据库,再更新缓存。
2、先更新缓存,再更新数据库。
3、先删除缓存,再更新数据库。
4、先更新数据库,再删除缓存。【推荐方式】
虽然推荐方式4,但该方式也不是完美的,只是该方式相较于其它三种方式它是最好的。
我们先来看看方式4不完美的地方在哪,假设有读请求A和写请求B,可能会出现如下情况:
(1)缓存恰好失效。
(2)请求A缓存不命中,查询数据库获得旧值。
(3)请求B将新值写入数据库。
(4)请求B删除缓存。
(5)请求A将在步骤(2)中获得的旧值写入缓存。
从上面的步骤可以看出,数据库虽然写入了新值,但缓存写入的仍然是旧值,出现了数据库和缓存的数据不一致问题。
出现上述情况有几个必要条件,首先是读请求缓存不命中(主要是引发后续的写入缓存操作),其次是有一个并发的写请求,最后是写数据库比读数据库更快。
同时具备三个条件的概率是比较低的,尤其是第三个条件,由于读数据库远比写数据库快,大多数情况是请求A从数据库读出旧值并完成写入缓存,请求B还没完成写入数据库,结果就是请求A写入的缓存最终被请求B给删除了。