【4种方案】如何保证Redis与数据库的数据一致!

这篇具有很好参考价值的文章主要介绍了【4种方案】如何保证Redis与数据库的数据一致!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如何保证Redis与数据库的数据一致

ONE 案例

先删除“缓存”再去更新“数据库”。但是该方案还存在问题:

        在高并发情况下,第一个线程删除缓存,还没来得及去操作数据库,这时第二个线程访问缓存,发现为null,于是去数据库查询,获取到需要的值,这时候第一个线程才开始操作数据库,然后设置缓存,但是第二个线程又跟奇怪的将第一个线程刚设置的缓存给覆盖掉,然后就出现“乌龙”,数据不一致的问题也出现了!

解决方案:

① 先操作缓存去修改数据库,但不删除缓存。将这个不删除的缓存设置为一个特殊值(*123),当客户端读缓存的时候,发现有前缀包含( * ???),知道他是坏值,就会进行休眠(1秒这样),然后再去查询Redis。 //这样做的弊端是:特殊值对业务可能出现影响,休眠时间会重复(高并发情况下,修改操作频繁,反复会修改这个特殊值的内容,然后同时出现睡眠),影响性能。

②延迟双删,先删除缓存数据,再把数据更新到数据库中,休眠一会(根据业务逻辑的耗时,更改休眠时间)后再次删除该缓存数据。若线程1是更新请求,线程2是查询请求,延迟双删,可以保证再这两个请求同时存在的情况下的数据一致性!确保查询请求结束,更新请求可以删除查询请求造成的缓存脏数据。

总结:写操作不能太频繁!

TWO 案例

先删除“数据库”再去更新“缓存”

该案例的问题是:数据库写完之后,再删除缓存,但删除失败了,这会导致数据不一致。

解决方案:

①给缓存设置一个过期时间,但缺点是,过期时间内 不能保证数据是有用的数据,可能是上次没删掉的坏数据。

②引入MQ,保证原子操作。

一个去删缓存,一个去操作数据库。MQ若是删除操作失败了,启动MQ重试机制,在重试的这段时间,缓存数据不会更新。

③将热点数据缓存设置为永不过期,但是在value当中写入一个逻辑上的过期时间,另外起一个后台线程,扫描这些key,对于已逻辑上过期的缓存,进行删除。

总结:始终只能保证一定时间内的最终一致性。

THREE 案例

Redis和Mysql集群实现的读写分离架构

        如果MySQL采用的是读写分离的架构,主从服务器之间也会存在时间差,也就是A更新操作,删除缓存,并请求主数据库进行数据更新,主库与从库进行同步数据的操作,B进行查询操作时,缓存中没有数据,就去从库中读取数据,此时主从数据未更新完成,拿到的还是旧数据。

解决方法是:查询数据经过Redis时,若查询缓存为空时,强制将其指向主数据库中进行查询。

Four 案例

异步更新缓存(基于订阅binlog的同步机制)

MySQL binlog增量订阅消费+消息队列+增量数据更新到redis

读Redis:热数据基本都在Redis

写MySQL:增删改都是操作MySQL

更新Redis数据:MySQ的数据操作binlog,来更新到Redis Redis更新

①数据操作主要分为两大块:

一个是全量(将全部数据一次写入到redis)

一个是增量(实时更新) 这里说的是增量,指的是mysql的update、insert、delate变更数据。

读取binlog后分析 ,利用消息队列,推送更新各台的redis缓存数据。

这样一旦MySQL中产生了新的写入、更新、删除等操作,就可以把binlog相关的消息推送至Redis,Redis再根据binlog中的记录,对Redis进行更新。

这种机制,很类似MySQL的主从备份机制,因为MySQL的主备也是通过binlog来实现的数据一致性。

这里可以结合使用canal(阿里的一款开源框架),通过该框架可以对MySQL的binlog进行订阅,而canal正是模仿了mysql的slave数据库的备份请求,使得Redis的数据更新达到了相同的效果。

参考文献

如何保证Redis与数据库的数据一致性_mr.two white的博客-CSDN博客_redis保证数据一致性

面试33-如何保证Redis与数据库的数据一致_哔哩哔哩_bilibili文章来源地址https://www.toymoban.com/news/detail-633793.html

到了这里,关于【4种方案】如何保证Redis与数据库的数据一致!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • redis的缓存更新策略以及如何保证redis与数据库的数据一致性

    redis的缓存更新策略有这么几种: 1、由应用直接和redis以及数据库相连接:         查询数据时,应用去redis中查询,查不到的话再由应用去数据库中查询,并将查询结果放在redis;         更新数据时,由应用去触发redis数据的删除以及数据库的update。 2、应用只跟redi

    2024年02月13日
    浏览(57)
  • 如何保证Redis缓存和数据库的一致性问题

    熟练掌握Redis缓存技术? 那么请问Redis缓存中有几种读写策略,又是如何保证与数据库的一致性问题 今天来聊一聊常用的三种缓存读写策略 首先我们来思考一个问题 写 先更新缓存 再更新数据库 首先如果缓存更新成功但数据库更新失败,会导致数据不一致的问题 其次当请求

    2024年02月14日
    浏览(51)
  • redis面试题目-如何保证数据库与缓存的数据一致性

    原视频:https://www.bilibili.com/video/BV1Km4y1r75f?p=62vd_source=fa75329ae3880aa55609265a0e9f5d34 由于缓存和数据库是分开的,无法做到原子性的同时进行数据修改,可能出现缓存更新失败,或者数据库更新失败的情况,这时候会出现数据不一致,影响前端业务 先更新数据库,再更新缓存。缓

    2024年02月05日
    浏览(64)
  • Redis缓存MySQL数据库存储二者如何保证数据一致性

    在大型互联网应用中,由于数据库读写频繁、压力大等原因,我们通常会使用缓存来减少数据库的访问次数,提高系统的性能。而Redis作为一个高性能的内存数据库,成为了缓存的首选方案之一。但是,缓存和数据库之间存在数据一致性的问题,如何解决这个问题呢?本文将

    2023年04月19日
    浏览(52)
  • 怎样保证数据库和redis里的数据一致性

    使用缓存更新策略:在更新数据库时,同时更新Redis中相应的数据。这可以通过编写代码来实现,在数据库更新操作完成后,同步更新Redis中对应的数据。这可以通过在代码中使用事务来保证更新的原子性,确保数据库和Redis中的数据保持一致。 使用消息队列:可以将数据库更

    2024年02月19日
    浏览(46)
  • Redis和数据库保持数据一致性方案

    Redis和数据库一致性又称为“双写一致性”,在分布式系统中,由于多个节点之间的并发读写操作,可能导致数据不一致的情况发生。本文将着重介绍如何通过使用Redis与数据库相结合的方案来实现数据一致性。 首先,读取数据时都是先查询Redis,命中则直接返回,未命中则先

    2024年02月11日
    浏览(88)
  • redis和数据库的一致性问题的解决方案

    当前没有框架能够保证redis的数据和数据库的完全一致性,所以需要 我们自己在性能和一致性上作取舍。 下图就是两种在redis缓存数据库内容时的使用。 那么如一个节点的两个图: 缓存的生成,是在首次查询或者缓存过期时间到或者缓存被其他业务删除,进而需要在数据库

    2023年04月08日
    浏览(39)
  • REDIS21_缓存双写一致方案、先更新数据库再删除缓存

    ①. 缓存双写一致性,谈谈你的理解 如果redis中有数据,需要和数据库中的值相同 如果redis中无数据,数据库中的值要是最新值 ②. 什么时候同步直写? 小数据,某条、某一小戳热点数据,要求立刻变更,可以前台服务降价一下,后台马上同步直写 ③. 什么时候异步缓写? 正常业务,马

    2023年04月08日
    浏览(47)
  • Redis如何保障缓存与数据库的数据一致性问题?

    目录 一.最经典的数据库加缓存的双写双删模式 二. 高并发场景下的缓存+数据库双写不一致问题分析与解决方案设计 三、上面高并发的场景下,该解决方案要注意的问题 1.1 Cache Aside Pattern概念以及读写逻辑 (1)读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取

    2023年04月21日
    浏览(49)
  • Redis 缓存与数据库双写不一致如何解决

    Redis缓存与数据库双写不一致是一个常见的挑战,但可以通过一些方法来解决或减轻这种不一致性。以下是一些可能的解决方案: 事务处理: 在进行缓存和数据库双写时,确保它们被包含在同一事务中。这可以通过使用支持事务的数据库和Redis事务来实现。这样,要么两者同

    2024年01月21日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包