mysql和redis的双写一致性问题

一,使用方案

在使用redis作为缓存的场景下,我们一般使用流程如下

在这里插入图片描述

二,更新数据场景

我们此时修改个某条数据,如何保证mysql数据库和redis缓存中的数据一致呢?
按照常规思路有四种办法,1.先更新mysql数据,再更新缓存数据 2.先更新缓存数据,再更新mysql数据
3.先删除缓存,再更新mysql数据 4.先更新mysql数据,再删除缓存 。
这四种方法各有各的弊端,并不能完全保证数据一致性,采用“先写 MySQL,再删除 Redis”的策略,这种情况虽然也会存在两者不一致,但是需要满足的条件有点苛刻,所以是满足实时性条件下,能尽量满足一致性的最优解。对于不是强一致性要求的业务,可以容忍。(什么情况下不能容忍呢,比如秒杀业务、库存服务等。)
为什么采用删除缓存而不是更新缓存,是因为高并发下产生脏数据的要求要比更新缓存的要求更多,也就是删除缓存产生脏数据的概率更小一些。
那么问题又来了,在高并发的情况下
采用先删除缓存,再更新数据库

  • 请求A来了,删除缓存
  • 请求A更新数据库,发生卡顿,同时来了请求B
  • 请求B发现没有缓存,就从数据库查询了数据,并生成了缓存
  • 此时请求A卡顿结束,更新了数据库
    这个情况下,缓存中的就是脏数据。我们采用延时双删来解决
    在这里插入图片描述
    那么问题又来了,第二次删除缓存失败了怎么办?看下面
  • 先更新数据库,再删除缓存
    如果删除缓存失败,怎么保证数据一致性?
    1.使用重试机制,可以直接在接口中重试,但是比较耗费性能
    2.使用异步队列重试
    3.使用rabbitmq消息中间件来处理
    当用户操作写完数据库,但删除缓存失败了,产生一条mq消息,发送给mq服务器。
    mq消费者读取mq消息,重试5次删除缓存。如果其中有任意一次成功了,则返回成功。如果重试了5次,还是失败,则写入死信队列中。
    当然在该方案中,删除缓存可以完全走异步。即用户的写操作,在写完数据库之后,不用立刻删除一次缓存。而直接发送mq消息,到mq服务器,然后有mq消费者全权负责删除缓存的任务。
    因为mq的实时性还是比较高的,因此改良后的方案也是一种不错的选择。

总结:以上方法只能保证最终一致性,不能保证强一致性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/700065.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx配置详细解释:(5)rewrite重写功能

rewrite重写功能,在编译安装时需要有相应的模块,ngx_http_rewritte_module模块指令中,有if指令,return,set,break等指令。 1.ngx_http_rewrite_module模块指令 1.if指令 if指令在nginx配置中,用于条件判断&#xff…

2024年山西水处理技术设备展览会11月8日召开

2024中国(山西)国际水务科技博览会 暨水处理技术设备与泵管阀展览会 时间:2024年11月8-10日 地点:山西潇河国际会展中心 推动城镇水务工作高质量发展,围绕解决水生态、水安全、水体黑臭、内涝积水等人民群众最关…

pikachu靶场通关全流程

目录 暴力破解: 1.基于表单的暴力破解: 2.验证码绕过(on server): 3.验证码绕过(on client): token防爆破: XSS: 1.反射型xss(get): 2.反射性xss(post): 3.存储型xss&#…

解决:RuntimeError: “slow_conv2d_cpu“ not implemented for ‘Half‘的方法之一

1. 问题描述 今天跑实验的时候,代码报错: RuntimeError: "slow_conv2d_cpu" not implemented for Half 感觉有点莫名奇妙,经检索,发现将fp16改为fp32可以解决我的问题,但是运行速度太慢了。后来发现&…

如何使用免费的 Instant Data Scraper快速抓取网页数据

Instant Data Scraper 是一款非常简单易用的网页数据爬虫工具,你不需要任何代码知识,只需要点几下鼠标,就可以把你想要的数据下载到表格里面。以下是详细的使用步骤: 第一步:安装 Instant Data Scraper 打开谷歌浏览…

ARM32开发--PWM与通用定时器

知不足而奋进望远山而前行 目录 文章目录 前言 学习目标 学习内容 PWM pwm原理 需求 开发流程 初始化PWM PWM占空比控制 main函数修改duty 输出通道 关心的内容 重要的关键词 周期 分频 占空比 总结 前言 在微控制器开发中,理解和掌握PWM&#x…

美团强势领涨恒指,港股即将迎来触底反弹?

恒指早间低开低走,持续低位徘徊,一度试探万八关口,最低见17994点,市场情绪表现疲弱,大型科技股普遍走低,但主要指数午后回升,恒生科技指数率先转涨,美团(3690.HK)涨超4%领涨成分股&a…

流程与IT双驱动:锐捷网络如何构建持续领先的服务竞争力?

AI大模型及相关应用进入“竞赛时代”,算力作为关键要素备受关注,由于算力行业对网络设备和性能有较大需求,其发展也在推动ICT解决方案提供商加速升级,提升服务响应速度和服务质量。 锐捷网络是行业领先的ICT基础设施及行业解决方…

[CAN] DBC数据库编辑器的下载与安装

DBC数据库编辑器 1 概述2 下载与安装2.1 下载2.2 安装 1 概述 VectorCANdb是一款专为CAN(Controller Area Network)通信设计的数据管理工具。这款软件为工程师们提供了一个全面、高效的平台,用于定义、修改和管理与CAN网络相关的数据&#xf…

rospkg.os_detect.OsNotDetected检测不到系统的解决办法

遇到上述报错时,可以参考博客进行解决

易舟云:让中小企业财务管理变得触手可及

在现代企业运营中,财务管理的精准和高效至关重要。对于中小企业来说,一款专业且易于使用的财务软件更是必不可少的工具。今天,我们就来详细了解一款深受中小企业喜爱的财务软件——易舟云。 财务管理的云端革命 随着云技术的发展,…

LeetCode:419. 甲板上的战舰(遍历 Java)

目录 419. 甲板上的战舰 题目描述: 实现代码与解析: 遍历 原理思路: 419. 甲板上的战舰 题目描述: 给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 X 或者是一个空位 . &…

关于flutter 启动 页面加载空白(三四秒空白页面)

一:可以在 对应的xml配置启动动画 <item><bitmapandroid:gravity"center"android:src"mipmap/ic_launcher" /></item> 二&#xff1a;以下是对应的文件目录 注意事项&#xff1a;俩处xml都配置一下&#xff0c;配置一样就可以了

常见数据编码方式

数据编码方式&#xff1a; 二进制数字信息在传输过程中可以采用不同的代码&#xff0c;各种代码的抗噪声特征和定时功能各不相同&#xff0c;实现费用也不一样。下面介绍几种常用的编码方式。 1、单极性码 在这种编码方案中&#xff0c;只用正的&#xff08;或负的&#xff09;…

计算机哈佛架构、冯·诺依曼架构对比

哈佛架构和冯诺依曼架构是两种不同的计算机系统架构&#xff0c;它们在存储器组织方式上有着显著的区别。下面是它们的原理、优缺点的对比以及一些常见的 MCU 采用的架构&#xff1a; 哈佛架构&#xff1a; 原理&#xff1a;哈佛架构将指令存储器&#xff08;程序存储器&#x…

PyCharm QThread 设置断点不起作用

背景&#xff1a; 端午节回来上班第一天&#xff0c;不想干活&#xff0c;领导又再后面看着&#xff0c;突然想起一个有意思的问题&#xff0c;为啥我的程序在子进程QThread的子类里打的断点不好用呢&#xff1f;那就解决一下这个问题吧。 原因&#xff1a; 如果您的解释器上…

面试-NLP八股文

机器学习 交叉熵损失&#xff1a; L − ( y l o g ( y ^ ) ( 1 − y ) l o g ( 1 − ( y ^ ) ) L-(ylog(\hat{y}) (1-y)log(1-(\hat{y})) L−(ylog(y^​)(1−y)log(1−(y^​))均方误差&#xff1a; L 1 n ∑ i 1 n ( y i − y ^ i ) 2 L \frac{1}{n}\sum\limits_{i1}^{n}…

【Python基础】名称空间和作用域

1.名称空间 将栈区进行分类&#xff0c;这些分类就是名称空间 名称空间存放什么名字空间个数何时创建&销毁内置名称空间built-inPython解释器内置的名字1个Python解释器启动&解释器关闭 全局名称空间 global Python文件内定义的类名&#xff0c;变量名&#xff0c;模块…

【FreeRTOS】ARM架构汇编实例

学习视频 【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS&#xff08;FreeRTOS教程 基于STM32&#xff0c;以实际项目为导向&#xff09;】 https://www.bilibili.com/video/BV1Jw411i7Fz/?p9&share_sourcecopy_web&vd_source8af85e60c2df9af1f0fd23935753a933…

php yield使用

一&#xff0c;概念 yield简单的调用形式看起来像一个return申明&#xff0c;不同之处在于普通return会返回值并终止函数的执行&#xff0c;而yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。yield只有在调用的时候才会执行&#xff0c;并不产生多余的…