Redis-Mysql 双写一致

如何保证缓存和数据库双写时的一致

一致问题可以分为两大类:强一致和最终一致。

强一致的解决方法有:

延时双删:先删除缓存,再更新数据库,最后再删除缓存。之所以要再删除缓存,是为了防止还没更新数据库前,其他线程又去从数据库中读取导致缓存重新加载。

最终一致性的解决方法有:

删除补偿:先更新数据库,再删除缓存,如果删除缓存失败的话,就将失败记录放到消息队列中,之后再继续去删除,从而保证最终一致性。 先更新缓存,再更新数据库:更新缓存成功后,更新数据库失败时可以记录到消息队列中,之后继续更新。这样能保证从缓存中拿到的是最新值,但也有一种情况:缓存过期且数据库还未更新时,这样就拿到了脏数据。

当然,可以不使用消息队列,通过 Cannel 等组件去监听 Mysql 的 binlog 文件,当 binlog 发生改变时,取出改变的记录,分析并删除对应的缓存。

updatedupdated2022-06-232022-06-23