redis缓存一致性问题
在实际业务中,经常会涉及到缓存,那么保持缓存数据和数据库数据之间的一致性同样是一个非常重要的举措
三种常见的缓存更新方案
方案一| 先更新数据库,再更新缓存
问题:
高并发时,如果线程A更新完数据库,线程B再次更新数据库,线程B比线程A先一步更新缓存,那么缓存还是线程A的数据,数据库是线程B的数据
方案二 | 先删除缓存,再更新数据库
问题:
线程A更新数据,先删除缓存,此时,线程B读取数据,因为此时线程A还未上锁,所以线程B可以从数据库读取数据,并且再次存入缓存中
改进| 延时双删
即根据业务需要,在延迟多少时间后再把缓存删除
问题:
延迟删除,会影响接口吞吐量,影响接口性能
第二次删除可能存在问题
方案三| 先更新数据库,再删除缓存
问题:
线程A读取数据,恰好此时没有缓存时,从数据库读到旧值,线程B更新新值到数据库后删除缓存,删除缓存,线程A更新缓存
概率较低,数据库操作中极少出现查询比更新慢的情况
基于消息的队列| 异步更新缓存
基于订阅binlog的同步机制
模仿mysql的主从复制交互协议,将自己伪装成mysql slave 向mysql master 发送dump协议
mysql master收到dump请求,推送bin log给的slave
解析bin log对象
利用消息队列进行分发消费
最终一致性
给缓存添加过期时间可以保证缓存的最终一致性
作者:Whitestorm_wuha
链接:https://juejin.cn/post/7084155449896861727
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。