redis 的不一致性问题

# # 明确一点,redis 一定会有不一致性问题

用一张图来表示在多线程场景下不一致问题

  1. 查询过程:先去缓存查询,查询不到就走数据库查询,然后写到缓存中去。

  2. 更新过程:先更新数据库,然后再更新缓存。 先更新数据库,再删除缓存。 这都会有脏读的可能。

  3. 加锁似乎能解决问题,这要多读和写都加上锁,才能解决一致性问题。但是,我们加缓存就是为了提高效率的,加锁就意味着逆道而行了。所以并不可取。

  4. 企业中,其实是要保证最终一致性。我们要明确一点就是redis就是有一致性问题。

  5. 通过设置过期时间,来达到最终一致性。

# # 最终的采用方案

  Canal 组件,用来收集mysql的变化,然后及时的更新缓存。

  其实并没有解决redis 的一致性问题,这套方案,也不能百分百的保证 redis 的一致性。这要方案只是一个解耦,将redis 的维护,从业务中剥离出来。 也就是说,canal 是一个中间件,用来监听 数据库的变化,然后来维护缓存。

  这套方案也只是最大程度上解决一致性问题,不能百分百保证。

# #  Canal 是阿里开源的组件 

 不做过多的介绍了,直接看官网,简单明了十分钟入门。

http://alibaba.github.io/canal/

发布了336 篇原创文章 · 获赞 295 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/star1210644725/article/details/104011177