Redis高级系列-缓存双写一致性

这篇具有很好参考价值的文章主要介绍了Redis高级系列-缓存双写一致性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Redis高级系列-缓存双写一致性

1. 什么叫做缓存双写一致性?

Redis缓存双写一致性是指在更新数据库数据后,同时更新缓存数据以保持数据一致性的策略,总的来说,就是写入redis写入数据库的数据要保持一致

2. 缓存双写一致性有那些解决方案?

2.1 Cache Aside Pattern(旁路缓存模式)

旁路缓存模式,字面意思理解:缓存是旁路,缓存相对与应用程序和数据库是旁路,应用程序可以直接绕过缓存访问数据库

Redis高级系列-缓存双写一致性,Redis,缓存,redis

在Cache Aside模式中,应用程序首先从缓存中读取数据,如果缓存中不存在,则从数据库中读取数据,并将数据写入缓存中。在更新数据时,应用程序首先更新数据库中的数据,然后删除缓存中的数据。当下一次请求到来时,应用程序会从数据库中读取最新的数据,并将其写入缓存中

那为什么要先更新数据库在删除缓存了?我们再看看几种更新策略

策略 是否是多线程 场景 现象
先删除缓存再更新数据库 删除缓存成功但数据库更新失败 应用程序从数据库中读到旧值
缓存删除成功但数据库再更新中…有并发读请求 并发读请求从数据库读到旧值,并回写到redis,导致后续都从redis读取到旧值
先更新数据库再删除缓存 数据库更新成功,但缓存删除失败 应用程序从redis读取到旧值
数据库更新成功,但缓存再删除中…有并发读请求 并发读请求读取到旧值
先更新缓存再更新数据库 更新缓存成功但更新数据库失败 缓存和数据库数据不一致(不推荐,一般数据库作为兜底方案)
更新缓存成功但数据库再更新中 缓存和数据库数据不一致(不推荐,一般数据库作为兜底方案)
先更新数据库再更新缓存 更新数据库成功但缓存更新失败 应用程序读取到旧值
更新数据库成功但缓存再更新中…有并发读请求 并发读请求读取到旧值
延迟双删

经过我们对Cache Aside Pattern四种方案的八种场景进行仔细分析,我们大体上确定了先更数据库再删缓存的方案。但是这种方案也并不完美,假设我们更新数据库成功了,删除缓存失败了,那么同样会出现一致性问题。为了解决这种场景下的一致性问题,我们进一步引入了延迟双删方案来解决。

Redis高级系列-缓存双写一致性,Redis,缓存,redis

  • 为什么要做两次缓存删除呢?

从上图“延迟双删”中我们可以很清晰地看到,数据库的更新是在首次的缓存删除成功后进行的,这样就有效避地免了“先更数据库再删缓存”方案中可能出现的数据库更新成功缓存删除失败导致的一致性问题。第二次的缓存删除是为了避免在执行更新数据库操作完成之前其它线程读取数据库并更新缓存而导致的一致性问题。

  • 为什么第二次缓存删除又要延迟执行呢?

试想,如果我们不做第二次的延迟删除,而是更新数据库后立即删除会出什么问题?有没有可能其它读请求线程在更新数据库之前读取了数据,并在第二次立即删除缓存之后更新了缓存。很明显,延迟删除就是为了让可能存在的其它读请求线程尽可能地在更新完缓存后再执行缓存删除操作。这样一通操作后,数据库是最新的数据了,缓存里没有数据,后面的读请求线程又可以拿到数据库的最新数据写入缓存了。

  • 延迟删除具体需要延迟多长时间?

对于这个具体需要延迟多长时间,其实没有绝对的标准,唯一的标准就是根据读请求的耗时来确定,读请求越耗时,延迟时间越长。一般情况下我们设置的延迟时间为1秒。

重试删除

在上面的延迟双删方案中,如果我们思考,其实还是有诸多问题的。比如:在延迟双删的读写场景中,如果第二次缓存删除失败了,同样会出现一致性问题。那么删除失败了,重试几次不就好了吗?基于这个思想我们进一步引入了重试删除方案来解决

Redis高级系列-缓存双写一致性,Redis,缓存,redis

重试删除确实很大程度上解决了一致性问题,并且逻辑非常简单。唯一的不足可能就是需要引入消息队列,并且业务代码也会有一定的侵入。那么有没有既能够保证最终一致性,又能够解耦的方案呢?我们继续往下面看

binlog订阅异步删除

Redis高级系列-缓存双写一致性,Redis,缓存,redis

Redis高级系列-缓存双写一致性,Redis,缓存,redis

binlog订阅异步删除确实也能解决一致性问题,对代码也无任何侵入,但是整个架构复杂,中小项目一般都用不上。

2.2 Read Through/Write Through(读写穿透)

该策略又被称为读穿/写穿策略,和CacheAside策略的缓存数据与数据库数据为准不同,该策略的核心是用户只与缓存层交互(应用程序只与缓存或者中间层、缓存抽象层交互),由缓存层与数据库通信,写入或读取数据。

在读取数据时,通过缓存层进行读取,若缓存存在则直接返回,若不存在则由缓存层拉取数据库数据到缓存中并返回。
在写数据时,通过缓存层进行写入,若缓存存在则直接写入缓存中并同步到数据库,若不存在则写入数据库中。

Redis高级系列-缓存双写一致性,Redis,缓存,redis

使用场景

适用于读多写多的场景,数据一致性要求较高的场景。

2.3 Write Behind(后写或异步写)

Write Behind Caching是一种将缓存和数据库异步写入的缓存模式。在Write Behind Caching模式中,应用程序首先将更新操作写入缓存中,然后异步地将更新操作写入数据库中。当下一次请求到来时,应用程序会从缓存中读取数据,并将其写入数据库中。
Redis高级系列-缓存双写一致性,Redis,缓存,redis

使用场景

适用于写多读少的场景,数据一致性要求不高的场景

3. 总结

在使用Redis缓存时,应根据具体的业务场景和需求选择合适的缓存模式。Cache Aside模式简单易用,适用于读多写少的场景;Read/Write Through模式完全解耦缓存和数据库,适用于读多写多的场景;Write Behind Caching模式可以提高写入性能,适用于写多读少的场景。在实际应用中,可以根据具体的业务需求和性能要求,选择合适的缓存模式,以提高系统的性能和稳定性。文章来源地址https://www.toymoban.com/news/detail-808057.html

到了这里,关于Redis高级系列-缓存双写一致性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Redis】聊一下缓存双写一致性

    缓存虽然可以提高查询数据的的性能,但是在缓存和数据 进行更新的时候 其实会出现数据不一致现象,而这个不一致其实可能会给业务来带一定影响。无论是Redis 分布式缓存还是其他的缓存机制都面临这样的问题。 数据一致性 缓存中有数据,那么缓存的数据和数据库的数据

    2024年02月06日
    浏览(44)
  • Redis缓存双写一致性之更新策略

    你只要用缓存,就可能会涉及到redis缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 双写一致性,你先动缓存redis还是数据库mysql哪一个?why? 延时双删你做过吗?会有哪些问题? 有这么一种情况,微服务查询redis无m

    2024年02月05日
    浏览(55)
  • Redis缓存问题:穿透,击穿,雪崩,双写一致性等

    在高并发场景下,数据库往往是最薄弱的环节,我们通常选择使用 redis 来进行缓存,以起到缓冲作用,来降低数据库的压力,但是一旦缓存出现问题,也会导致数据库瞬间压力过大甚至崩溃,从而导致整个系统崩溃.今天就聊聊常见的 redis 缓存问题. 缓存击穿 缓存击穿一般指redis中的一

    2024年04月27日
    浏览(45)
  • 【redis】缓存双写一致性之工程落地实现(下)

    提示:以下是本篇文章正文内容,下面案例可供参考 如何监听MySQL的变动? MySQL有一个binlog日志 伪装成从机,从主机获取二进制文件 配置不在详述 配置不再详述 a、业务类: 当MySQL进行增删改操作时,后台的canal会立刻监听捕捉到MySQL的二进制binlog日志文件改动,并通过Jav

    2023年04月19日
    浏览(30)
  • Redis双写一致性?

    双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。 Redis作为缓存,mysql的数据如何与redis进行同步呢?(双写一致性) 1.我们当时做排行榜业务时,把历史榜单数据存储到了缓存中。这个虽然也是热点数据,但是实时要求性不高。

    2024年02月16日
    浏览(39)
  • Redis(十四)双写一致性工程案例

    https://github.com/alibaba/canal 数据库镜像 数据库实时备份 索引构建和实时维护(拆分异构索引、倒排索引等) 业务 cache 刷新 带业务逻辑的增量数据处理 传统mysql主从复制原理 MySQL的主从复制将经过如下步骤: 当 master 主服务器上的数据发生改变时,则将其改变写入二进制事件日志

    2024年02月21日
    浏览(38)
  • Redis与MySQL双写一致性如何保证

    前言 在分布式系统中,数据一致性是一个重要的问题。当我们使用Redis和MySQL这两种不同的数据库时,如何保证它们之间的双写一致性是一个需要解决的难题。本文将探讨Redis与MySQL双写一致性的保证方法。 什么是双写一致性? 指的是当我们更新了数据库的数据之后redis中的数

    2024年02月09日
    浏览(40)
  • 如何保证redis与db的双写一致性

        如何保证redis与db的双写一致性?这是一个十分热门的面试话题。 如何理解“一致性”这个概念?“事务”中“一致性”的定义是: 事务执行前后,数据从一个合法性状态变换到另外一个合法性状态。  比喻说,更新前:redis中记录的是100,db中记录的也是100。更新后: 

    2024年02月07日
    浏览(39)
  • [优雅的面试]MySQL与Redis双写一致性方案

    前言 由于缓存的高并发和高性能已经在各种项目中被广泛使用,在读取缓存这方面基本都是一致的,大概都是按照下图的流程进行操作: 但是在更新缓存方面,是更新完数据库再更新缓存还是直接删除缓存呢?又或者是先删除缓存再更新数据库?在这一点上就值得探讨了。

    2024年01月21日
    浏览(37)
  • MySQL与Redis数据双写一致性工程落地案例

    多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个 互斥锁来锁住它。 其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后做缓存。 后面的线程进来发现已经有缓存了,就直接走缓存。   canal [kə\\\'næl],中文翻译

    2024年02月03日
    浏览(81)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包