延迟双删

1,743 阅读1分钟

什么是延迟双删?

①先删除缓存;

②再更新数据库;

③写入延迟消息,异步删除缓存,失败了进行异步重试;延迟时间需要大于等于mysql主从同步的时间。

为什么需要第一次删除缓存?

第一次删除缓存的目的是为了防止一个线程在更新数据库之后,删除缓存之前,其它线程的读请求读取缓存中的脏数据。

假设在MySql非主从架构下

假设没有第一次删除缓存的话

①线程A更新数据库;

②线程B读取缓存,命中,此时缓存中是旧数据;

③线程A删除缓存;

所以线程B在更新数据库之后,删除缓存之前,线程A读到了缓存中的脏数据,产生了数据库与缓存的不一致。

假设有第一次删除缓存的话

第一种情况:

①线程A删除缓存,更新数据库;

②线程B读取缓存,未命中,查询数据库,此时缓存中是新数据。

③线程A删除缓存;

此情况数据库与缓存的数据一致;

第二种情况:

①线程A删除缓存;

②线程B读取缓存,未命中,查询数据库,回写缓存,此时缓存是旧的数据;

③线程A更新数据库;

④线程A删除缓存;

所以线程B在线程A更新数据库之前读到了数据库中旧的数据,但是这种是合理的场景,因为数据库还未更新,缓存就不能读到新的数据。后面第③④步,线程A更新数据库之后又删除了缓存,可以避免其它读请求产生的脏数据。