缓存与数据库一致性问题

概述

这里的“一致性”包含了两种情况:

  • 缓存中有数据,那么,缓存的数据值需要和数据库中的值相同;

  • 缓存中本身没有数据,那么,数据库中的值必须是最新值。

不符合这两种情况的,就属于缓存和数据库的数据不一致问题了。

解决方案

重试机制

具体来说,可以把要删除的缓存值或者是要更新的数据库值暂存到消息队列中(例如使用 Kafka 消息队列)。当应用没有能够成功地删除缓存值或者是更新数据库值时,可以从消息队列中重新读取这些值,然后再次进行删除或更新。

两种不同顺序存在的问题:

  • 情况一:先删除缓存,再更新数据库。

    延迟双删方案:在线程 A 更新完数据库值以后,我们可以让它先 sleep 一小段时间,再进行一次缓存删除操作。

  • 情况二:先更新数据库值,再删除缓存值。

    这种情况对业务的影响较小。

总结:

image-20230322151302575