一般情况下Redis是用于 应用层与数据库之间的一个读操作的缓存层
主要目的是去减少数据库的IO、还可以提升数据库的性能
当应用程序需要查询某个数据的时候、会先尝试去Redis中进行加载、如果命中、就直接返回、如果没有找到数据、再进入数据库进行查询、 查询到数据之后再缓存到Redis里面
当数据发生变化时、Redis和MySQL如何保证数据的一致性?
解决方案:
1、先更新数据库、再更新Redis
此方法如果缓存更新失败、就会导致数据库和缓存中的数据不一致
2、先删除数据库、再更新数据库
如果先删除Redis、再更新数据库
理想条件下:
下次进行查询时、Redis数据为空、查询未命中、然后到数据库进行查询、最后保存Redis、理论上数据是一致的
极端条件下:
由于删除Redis和更新数据库这 两个操作 不是 原子操作
此过程中、如果出现其他线程来访问、还是会导致数据的不一致
如果要再极端条件下仍然保证Redis和MySQL的数据一致性
只能采用最终一致性的一个方案
比如:
基于RocketMQ的可靠性消息通信
这个方案基于最终一致性来实现的、如果业务场景不能接受数据的短期不一致、不能采用此方案