本文主要是介绍redis 的不一致性问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
# # 明确一点,redis 一定会有不一致性问题
用一张图来表示在多线程场景下不一致问题
1. 查询过程:先去缓存查询,查询不到就走数据库查询,然后写到缓存中去。
2. 更新过程:先更新数据库,然后再更新缓存。 先更新数据库,再删除缓存。 这都会有脏读的可能。
3. 加锁似乎能解决问题,这要多读和写都加上锁,才能解决一致性问题。但是,我们加缓存就是为了提高效率的,加锁就意味着逆道而行了。所以并不可取。
4. 企业中,其实是要保证最终一致性。我们要明确一点就是redis就是有一致性问题。
5. 通过设置过期时间,来达到最终一致性。
# # 最终的采用方案
Canal 组件,用来收集mysql的变化,然后及时的更新缓存。
其实并没有解决redis 的一致性问题,这套方案,也不能百分百的保证 redis 的一致性。这要方案只是一个解耦,将redis 的维护,从业务中剥离出来。 也就是说,canal 是一个中间件,用来监听 数据库的变化,然后来维护缓存。
这套方案也只是最大程度上解决一致性问题,不能百分百保证。
# # Canal 是阿里开源的组件
不做过多的介绍了,直接看官网,简单明了十分钟入门。
http://alibaba.github.io/canal/
这篇关于redis 的不一致性问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!