REDIS21_缓存双写一致方案、先更新数据库再删除缓存

这篇具有很好参考价值的文章主要介绍了REDIS21_缓存双写一致方案、先更新数据库再删除缓存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

①. 什么是缓存双写一致

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

  • ③. 什么时候异步缓写?

  1. 正常业务,马上更新mysql,可以在业务上容许出现1个小时后redis起效
  2. 出现异常后,不得不将失败的动作重新修补,不得不借助Kafka或者RabbitMQ等消息中间件,实现解耦后重试重写

②. 先更新数据库,再更新缓存

  • ①. 先更新mysql的某商品的库存,当前商品的库存是100,更新为99个

  • ②. 先更新mysql修改为99成功,然后更新redis

  • ③. 此时假设异常出现,更新redis失败了,这导致mysql里面的库存是99而redis里面的还是100

  • ④. 上述发生,会让数据库里面和缓存redis里面数据不一致,读到脏数据

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

  • ①. A线程先成功删除了redis里面的数据,然后去更新mysql,此时mysql正在更新中,还没有结束。(比如网络延时)B突然出现要来读取缓存数据

  • ②. 此时redis里面的数据是空的,B线程来读取,先去读redis里数据(已经被A线程delete掉了),此处出来2个问题:

  1. B从mysql获得了旧值:B线程发现redis里没有(缓存缺失)马上去mysql里面读取,从数据库里面读取来的是旧值
  2. B会把获得的旧值写回redis:获得旧值数据后返回前台并回写进redis(刚被A线程删除的旧数据有极大可能又被写回了)
  • ③. A线程更新完mysql,发现redis里面的缓存是脏数据

  • ④. 总结流程文章来源地址https://www.toymoban.com/news/detail-403830.html

  1. 请求A进行写操作,删除缓存后,工作正在进行中…A还么有彻底更新完
  2. 请求B开工,查询redis发现缓存不存在
  3. 请求B继续,去数据库查询得到了myslq中的旧值
  4. 请求B将旧值写入redis缓存
  5. 请求B将旧值写入redis缓存
    REDIS21_缓存双写一致方案、先更新数据库再删除缓存
  • ⑤. 采用延时双删策略:
    加上sleep的这段时间,就是为了让线程B能够先从数据库读取数据,再把缺失的数据写入缓存,然后,线程A再进行删除。所以,线程A Sleep的时间,就需要大于现场B读取数据再写入缓存的时间。这样一来,其他线程读取数据时,会发生缓存缺失,所以会从数据库中读取最新值。因为这个方案会在第一次删除缓存值后,延迟一段时间再去进行删除,所以我们也把它叫做"延迟双删"
    REDIS21_缓存双写一致方案、先更新数据库再删除缓存
  • ⑥. 这个删除该休眠多久呢?这个时间怎么确定呢?
  1. 在业务程序运行的时候,统计下线程读数据和写缓存的操作时间,自行评估自己的项目的读数据业务逻辑的耗时,以此为基础来进行估算。然后写数据的休眠时间则在读数据业务逻辑的耗时基础上加百毫秒即可
  2. 这么做的目的,就是确保读请求结束,写请求可以删除读请求造成的缓存脏数据
  • ⑦. 这种同步淘汰策略,吞吐量降低怎么办?异步删除
    REDIS21_缓存双写一致方案、先更新数据库再删除缓存

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

  • ①. 异常原因:假如缓存删除失败或者来不及,导致请求再次访问redis时缓存命中,读取到的是缓存旧值
    REDIS21_缓存双写一致方案、先更新数据库再删除缓存
  • ②. 解决方案
  1. 可以把要删除的缓存值或者是要更新的数据库值暂存到消息队列中(例如使用Kafka/RabbitMQ等)
  2. 当程序没有能够成功地删除缓存值或者是更新数据库值时,可以从消息队列中重新读取这些值,然后再次进行删除或更新
  3. 如果能够成功地删除或更新,我们就要把这些值从消息队列中去除,以免重复操作,此时,我们也可以保证数据库和缓存的数据一致了,否则还需要再次进行重试
  4. 如果重试超过的一定次数后还是没有成功,我们就需要向业务层发送报错信息了,通知运维人员
    REDIS21_缓存双写一致方案、先更新数据库再删除缓存
  • ③. 谈谈为什么要引入MQ
  1. 在应用程序将数据更新到数据库后,将更新操作发送到消息队列中,然后再由消息队列异步地触发删除缓存数据的操作
  2. 这样做的好处是,即使在更新数据库后发生异常或者网络延迟等问题,数据更新操作也已经被放到消息队列中,并不会导致缓存数据和数据库数据不一致的问题

到了这里,关于REDIS21_缓存双写一致方案、先更新数据库再删除缓存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Redis 原理缓存过期、一致性hash、雪崩、穿透、并发、布隆、缓存更新策略、缓存数据库一致性

    redis的过期策略可以通过配置文件进行配置 redis会把设置了过期时间的key放在单独的字典中,定时遍历来删除到期的key。 1).每100ms从过期字典中 随机挑选20个,把其中过期的key删除; 2).如果过期的key占比超过1/4,重复步骤1 为了保证不会循环过度,导致卡顿,扫描时间上限

    2024年02月08日
    浏览(43)
  • redis的缓存更新策略以及如何保证redis与数据库的数据一致性

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

    2024年02月13日
    浏览(39)
  • 如何保证数据库、缓存的双写一致?

    在我们日常研发过程中,由于数据库的一些限制,我们经常使用缓存(如:Redis)来提升访问速率。此时,数据库和缓存双写数据就存在一致性问题,这个问题跟开发语言无关,在高并发场景下,问题更加严重。 另外,在面试、工作中也会经常遇到这个问题。所以这里跟大家

    2024年04月12日
    浏览(32)
  • 如何保证数据库和缓存双写一致性?

    如何保证数据库和缓存双写一致性,是面试中经常被问的一个技术问题,程序汪推荐大家有必要好好研究一波 数据库和缓存(比如:redis)双写数据一致性问题,是一个跟开发语言无关的公共问题。尤其在高并发的场景下,这个问题变得更加严重。 我很负责的告诉大家,该问

    2024年01月18日
    浏览(45)
  • 如何保证缓存与数据库双写时的数据一致性?

    背景:使用到缓存,无论是本地内存做缓存还是使用 Redis 做缓存,那么就会存在数据同步的问题,因为配置信息缓存在内存中,而内存时无法感知到数据在数据库的修改。这样就会造成数据库中的数据与缓存中数据不一致的问题。 共有四种方案: 先更新数据库,后更新缓

    2024年01月24日
    浏览(38)
  • 高并发下数据一致性问题:数据库+缓存双写模式分析

    随着互联网业务的发展,其中越来越多场景使用了缓存来提升服务质量。从系统角度而言, 缓存的主要目标是减轻数据库压力(特别是读取压力)并提高服务响应速度 。引入缓存就不可避免会涉及到缓存与业务数据库数据一致性的问题,而不同的业务场景对数据一致性的要

    2024年02月09日
    浏览(32)
  • 缓存与数据库双写一致性几种策略分析

    作者:京东零售 于泷 在高并发场景中,为防止大量请求直接访问数据库,缓解数据库压力,常用的方式一般会增加缓存层起到缓冲作用,减少数据库压力。引入缓存,就会涉及到缓存与数据库中数据如何保持一致性问题,本文将对几种缓存与数据库保证数据一致性的使用方

    2023年04月19日
    浏览(40)
  • 分布式系统中数据库和缓存双写一致性的实现技术

    标题:分布式系统中数据库和缓存双写一致性的实现技术 在分布式系统中,为了确保数据库和缓存之间的数据一致性,双写一致性成为了一个关键的挑战。本文将深入探讨如何利用一些常见的技术手段来保证数据库和缓存的双写一致性,以及通过举例说明这些技术是如何在实

    2024年01月16日
    浏览(42)
  • Redis生产实战-热key、大key解决方案、数据库与缓存最终一致性解决方案

    热 key 问题就是某一瞬间可能某条内容特别火爆,大量的请求去访问这个数据,那么这样的 key 就是热 key,往往这样的 key 也是存储在了一个 redis 节点中,对该节点压力很大 那么对于热 key 的处理就是通过热 key 探测系统对热 key 进行计数,一旦发现了热 key,就将热 key 在 jv

    2024年02月05日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包