什么是延迟双删?
①先删除缓存;
②再更新数据库;
③写入延迟消息,异步删除缓存,失败了进行异步重试;延迟时间需要大于等于mysql主从同步的时间。
为什么需要第一次删除缓存?
第一次删除缓存的目的是为了防止一个线程在更新数据库之后,删除缓存之前,其它线程的读请求读取缓存中的脏数据。
假设在MySql非主从架构下
假设没有第一次删除缓存的话
①线程A更新数据库;
②线程B读取缓存,命中,此时缓存中是旧数据;
③线程A删除缓存;
所以线程B在更新数据库之后,删除缓存之前,线程A读到了缓存中的脏数据,产生了数据库与缓存的不一致。
假设有第一次删除缓存的话
第一种情况:
①线程A删除缓存,更新数据库;
②线程B读取缓存,未命中,查询数据库,此时缓存中是新数据。
③线程A删除缓存;
此情况数据库与缓存的数据一致;
第二种情况:
①线程A删除缓存;
②线程B读取缓存,未命中,查询数据库,回写缓存,此时缓存是旧的数据;
③线程A更新数据库;
④线程A删除缓存;
所以线程B在线程A更新数据库之前读到了数据库中旧的数据,但是这种是合理的场景,因为数据库还未更新,缓存就不能读到新的数据。后面第③④步,线程A更新数据库之后又删除了缓存,可以避免其它读请求产生的脏数据。