Redis教程

Redis和数据库数据不一致的问题

本文主要是介绍Redis和数据库数据不一致的问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

针对读多写少的高并发场景,我们可以使用缓存来提升查询速度。

• 如果数据在Redis存在,应用就可以直接从Redis拿到数据,不用访问数据库。

• 如果Redis里面没有,先到数据库查询,然后写入到Redis,再返回给应用。

问题一:

  • 一旦被缓存的数据发生变化的时候,我们既要操作数据库的数据,也要操作Redis的数据,所以问题来了。现在我们有两种选择:

• 先操作Redis的数据再操作数据库的数据

• 先操作数据库的数据再操作Redis的数据

只要有一方失败就会导致数据不一致

这种情况需要更具的我们的业务场景而定,数据库的实时性一致性要求不是特别高的场合,

可以采用定时任务查询数据库数据定时同步到Redis的方案。由于我们是以数据库的数据为准的,所以给缓存设置一个过期时间,是保证最终一致性的解决方案。

问题二:

当存储的数据发生变化,Redis的数据也要更新的时候,我们有两种方案,一种就是直接更新,调用set;还有一种是直接删除缓存,让应用在下次查询的时候重新写入。

判断是不是要经过其他表的查询、接口调用、经过复杂的计算才能得到最新的数据,而不是直接从数据库拿到的值,如果是的话,建议直接删除缓存,这种方案更加简单,一般情况下也推荐删除缓存方案。

异常情况:

  • 更新数据库成功,删除缓存失败。数据库是新数据,缓存是旧数据,发生了不一致的情况。

如果删除缓存失败,我们捕获这个异常,把需要删除的key发送到消息队列。然后自己创建一个消费者消费,尝试再次删除这个key,进行消息重试

  • 先删除缓存,再更新数据库

如果有程序并发操作的情况下:

•线程A需要更新数据,首先删除了Redis缓存

•线程B查询数据,发现缓存不存在,到数据库查询旧值,写入Redis,返回

•线程A更新了数据库

例如,我们产品库缓存,可以通过建刷新缓存的任务,来进行缓存刷新,不管线程A还是线程B都是建刷新缓存的任务,在业务上可以对同一个刷新缓存的id进行去重

具体得结合自己的业务场景,面试官基本会问你项目中的缓存时怎么使用的,怎么保证一致性的

这篇关于Redis和数据库数据不一致的问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!