Redis缓存和数据库数据的一致性问题
面试问到这个题的时候,只说了一个平时常用的方案,答的不全,但还有其他几种方案,这里整理下,下次注意
正常来说,查询数据的时候,都是先查询缓存,如果缓存没有,再去查询数据库,然后将数据写入到数据中。
这个时候,如果有更新操作,那就是需要更新数据库,然后更新缓存。这个情况下,如果缓存中的数据更新较慢,或者后面更新失败了,就会出现查询不一致的问题。
延时双删
先说步骤:先修改数据库、然后删除缓存、然后再延时一定时间再删除缓存
如果只删除一次缓存,这个时候如果出现并发操作,有高并发的读数据,在读到数据是旧数据的情况下,然后另一个线程删掉了缓存,那前一个线程旧可能把旧数据写回到缓存中。这个时候可以通过延时再删除一次
缺点: 这种方案的问题在于延时,延时多久比较合适是个问题。
发布订阅
先说方案:为了解决在两个操作在一起的问题,可以进行拆分解耦,用MQ实现异步处理。
当要更新数据的时候,只操作数据库,然后发布一条数据更新的消息到mq中,然后另外一个服务订阅消息处理Redis数据
缺点:增加了系统复杂度
调度任务异步
方案:上面说到了异步,那还有一种方案是通过定时任务的方式。每隔一段时间,将数据库的数据更新一份到Redis
缺点:延时问题,如果对一致性要求高,那不适合
监听binlog实现
方案:这种也是异步,需要监听mysql的数据变化日志binlog,然后更新Redis
缺点:局限性,对mysql适用