- 先删除缓存,再更新数据库
问题:先删除缓存,数据库还没有更新成功,此时如果读取缓存,缓存不存在,去数据库中读取到的是旧值,然后更新缓存,缓存不一致发生
解决办法:延迟双删 预估第二次查询时间,删除缓存且更新数据库后延迟一段时间再删一遍缓存,这样如果再有新的请求过来,发现缓存没数据就会去数据库里读取最新的数据,然后更新到缓存中 - 先更新数据库,再更新缓存
这里存在三种情况
- 1.请求A先写数据库,卡了没来得及删除缓存,请求B读到旧缓存,请求A删除缓存
- 2.请求B先查缓存,返回旧缓存;请求A写数据库,然后删除了缓存
以上两种情况都会延时双删一样,都会有可能有一次不一致;后续再有请求就会一致
失效场景:
这里唯一要担心的就是缓存失效,如下场景:
请求A查询缓存,缓存失效去查数据库查到旧值,然后更新旧值到缓存是卡住了
这时候请求B写数据库,写完数据库后删除了缓存,这时候请求A更新了旧值到缓存中;这时候就会造成缓存不一致
所以这里的过期时间设置需要特别注意,这种场景一般会比较少;因为是请求A查询缓存时,缓存正好失效且查数据库然后更新缓存比请求B写数据库删除缓存的时间还长
这里最核心的问题是:删除缓存失败
方案1:借助mq的消息最终一致性来保障
方案2:订阅mysql的binlog实现缓存的同步写操作