关键词:并发、缓存操作非常快
更新Redis和Mysql时出现的问题
先更新Mysql,再更新Redis时出现的问题
看图,来源小林coding链接。
先更新Redis,再更新Mysql时出现的问题
看图,来源小林coding。
不管谁先更新都会出现数据不一致的问题。那么咱不更新了,咱删除
更新数据库(有请求更新数据)时删除缓存,再把新数据写入缓存
这玩意叫旁路缓存层策略
图源小林coding
删除缓存时出现的问题
先删除缓存再更新数据库时出现的问题
看图
先更新数据库再删除缓存时出现的问题
看图似也会数据不一致,看上去缓存里是20,数据库是21。
但实际不会
因为缓存写入速度比数据库写入速度快。
再看这个图,我提前给每一步编了号,原图还是小林coding。
因为缓存写入快,所以这个图是错的,实际上执行完②之后立刻会执行好⑤。请求A秒完成。相当于没并发,就一个请求B。
所以正常更新数据库,再删除缓存就可以了。然后会把最新数据写入缓存。
最终方案: 先更新数据库,再删除缓存
所以要想保证redis和mysql数据一致,正确方案是先更新数据库,再删除缓存
问题: 假如删除缓存没有成功呢?
这样还会出现问题
**假如删除缓存没有成功呢?**此时更新了数据库,但是缓存里还是旧数据,读数据时读到的不还是错误数据吗?
解决方案一:把要删除的数据存入消息队列,如果删除失败就重试,删除成功就把数据从消息队列中移除
解决方案二:用Canal监听binlog
没学明白,不放图了,想看就去小林coding
说人话面试题
Redis和Mysql数据如何保证一致?
解决方案是在更新数据库的时候删除缓存。步骤是先更新数据库,再删除缓存,那么为了防止删除缓存失败,可以引入消息队列,将要删除的数据放在消息队列里,如果删除缓存失败,就一直重试,如果删除成功,就把数据移出消息队列。