Redis和数据库数据不一致的问题
2021/12/7 2:18:49
本文主要是介绍Redis和数据库数据不一致的问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
针对读多写少的高并发场景,我们可以使用缓存来提升查询速度。
• 如果数据在Redis存在,应用就可以直接从Redis拿到数据,不用访问数据库。
• 如果Redis里面没有,先到数据库查询,然后写入到Redis,再返回给应用。
问题一:
- 一旦被缓存的数据发生变化的时候,我们既要操作数据库的数据,也要操作Redis的数据,所以问题来了。现在我们有两种选择:
• 先操作Redis的数据再操作数据库的数据
• 先操作数据库的数据再操作Redis的数据
只要有一方失败就会导致数据不一致
这种情况需要更具的我们的业务场景而定,数据库的实时性一致性要求不是特别高的场合,
可以采用定时任务查询数据库数据定时同步到Redis的方案。由于我们是以数据库的数据为准的,所以给缓存设置一个过期时间,是保证最终一致性的解决方案。
问题二:
当存储的数据发生变化,Redis的数据也要更新的时候,我们有两种方案,一种就是直接更新,调用set;还有一种是直接删除缓存,让应用在下次查询的时候重新写入。
判断是不是要经过其他表的查询、接口调用、经过复杂的计算才能得到最新的数据,而不是直接从数据库拿到的值,如果是的话,建议直接删除缓存,这种方案更加简单,一般情况下也推荐删除缓存方案。
异常情况:
- 更新数据库成功,删除缓存失败。数据库是新数据,缓存是旧数据,发生了不一致的情况。
如果删除缓存失败,我们捕获这个异常,把需要删除的key发送到消息队列。然后自己创建一个消费者消费,尝试再次删除这个key,进行消息重试
- 先删除缓存,再更新数据库
如果有程序并发操作的情况下:
•线程A需要更新数据,首先删除了Redis缓存
•线程B查询数据,发现缓存不存在,到数据库查询旧值,写入Redis,返回
•线程A更新了数据库
例如,我们产品库缓存,可以通过建刷新缓存的任务,来进行缓存刷新,不管线程A还是线程B都是建刷新缓存的任务,在业务上可以对同一个刷新缓存的id进行去重
具体得结合自己的业务场景,面试官基本会问你项目中的缓存时怎么使用的,怎么保证一致性的
这篇关于Redis和数据库数据不一致的问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-08阿里云Redis项目实战入门教程
- 2024-11-08阿里云Redis资料:新手入门与初级使用指南
- 2024-11-08阿里云Redis教程:新手入门及实用指南
- 2024-11-07阿里云Redis学习入门:新手必读指南
- 2024-11-07阿里云Redis学习入门:从零开始的操作指南
- 2024-11-07阿里云Redis学习:初学者指南
- 2024-11-06阿里云Redis入门教程:轻松搭建与使用指南
- 2024-11-02Redis项目实战:新手入门教程
- 2024-10-22Redis入门教程:轻松掌握数据存储与操作
- 2024-10-22Redis缓存入门教程:快速掌握Redis缓存基础知识