11 如何保证缓存和数据库的一致性

vvEcho 2025-02-19 18:51:28
Categories: > Tags:
  1. 先删除缓存,再更新数据库
    问题:先删除缓存,数据库还没有更新成功,此时如果读取缓存,缓存不存在,去数据库中读取到的是旧值,然后更新缓存,缓存不一致发生
    解决办法:延迟双删 预估第二次查询时间,删除缓存且更新数据库后延迟一段时间再删一遍缓存,这样如果再有新的请求过来,发现缓存没数据就会去数据库里读取最新的数据,然后更新到缓存中
  2. 先更新数据库,再更新缓存
    这里存在三种情况

失效场景:
这里唯一要担心的就是缓存失效,如下场景:
请求A查询缓存,缓存失效去查数据库查到旧值,然后更新旧值到缓存是卡住了
这时候请求B写数据库,写完数据库后删除了缓存,这时候请求A更新了旧值到缓存中;这时候就会造成缓存不一致
所以这里的过期时间设置需要特别注意,这种场景一般会比较少;因为是请求A查询缓存时,缓存正好失效且查数据库然后更新缓存比请求B写数据库删除缓存的时间还长

这里最核心的问题是:删除缓存失败
方案1:借助mq的消息最终一致性来保障
方案2:订阅mysql的binlog实现缓存的同步写操作