mysql 与Redis 数据强一致方案

news2025/1/16 11:11:43

      • 前言
      • mysql与Redis能实现数据的强一致?
        • 分布式实现数据的强一致的方案是什么?mysql 与 Redis 能强一致吗?
          • Redis 的事务不适合实现强一致
          • 那怎么办?(mysql 与Redis 有强一致方案吗?)

前言

mysql与Redis一般不会使用强一致性因为不仅设计复杂并且性能差(典型的吃力不讨好类型),而是使用最终一致性

如果想了解mysql与Redis数据一致性问题可以看之前这篇:
https://blog.csdn.net/dengjiayue/article/details/145120778?fromshare=blogdetail&sharetype=blogdetail&sharerId=145120778&sharerefer=PC&sharesource=dengjiayue&sharefrom=from_link

mysql与Redis能实现数据的强一致?

我之前提了一个方案是,使用本地事务实现一致

伪代码逻辑

//开启事务
tx:=db.Start()

//更新 mysql 数据
err = tx.Update(data)
if err!=nil{
	tx.Rollback()
	return
}

//清除 Redis 数据
err = redis.Delete(key)
if err!=nil{
	tx.Rollback()
	return
}

//提交事务
err = tx.Commit()
if err!=nil{
	tx.Rollback()
	return
}

  1. 事务是强一致方案?
    事务(Redis 删除)不是强一致方案,

a. 对于 mysql 与 Redis 的数据来讲是最终一致性方案(要等到下一次查询,mysql 才与 Redis 的数据是一致的)

b. 对于数据查询来讲是查询到的一定是最新数据(Redis 清除后无法命中,只能查询 mysql 最新数据)
ⅰ. 只要用户点击更新数据接口并收到更新成功的返回,那么查询的数据就是更新的数据,不会查询到旧数据

c. 并且只适用于清除Redis数据, 如果更新数据将会有极大的 bug

如果是更新会怎么样?为什么只能删除?

  • 如果 Redis 更新成功了,但是在第二阶段 mysql 发送 commit 请求的时候失败了(比如mysql 宕机)那么 Redis 的数据与 mysql 的数据将会不一致(mysql 没有提交,所以是旧数据,而 Redis 是新数据),所以只适用与 Redis 清除的方案
分布式实现数据的强一致的方案是什么?mysql 与 Redis 能强一致吗?

分布式如何实现强一致
ⅰ. 共识算法(比如 raft)
ⅱ. 分布式事务

参考:
https://cn.pingcap.com/article/post/13082.html
https://juejin.cn/post/7316967969917009971(分布式事务 2pc/3pc实现强一致)
https://cloud.baidu.com/article/3076675

Redis 的事务不适合实现强一致

Redis 事务没有原子性,而是一个批量脚本,并不具备 像 mysql 那样的start 与 commit 的功能
ⅰ. 所以无法使用单纯的分布式事务(两阶段提交)来实现强一致性(Redis 无法持有数据的资源)

那怎么办?(mysql 与Redis 有强一致方案吗?)

mysql 与 Redis 实现强一致的方案: 分布式锁+补偿机制

  • 强一致的概念: mysql 与 Redis 数据同时生效,并且是相同的.
  1. 分布式锁解决的问题: Redis 无法持有数据资源的问题
  2. 补偿机制:解决Redis 无法回滚的问题(mysql 的回滚是通过 undo log 实现的 ,但是Redis 没有,只能记录数据之前 的状态来回滚)
    相当于给 Redis 赋予与 mysql 一样的事务的功能,然后再使用分布式事务两阶段提交的逻辑.

具体做法
● 更改时加分布式锁,拦截所有的读写请求
● 记录数据之前的状态(用于第二阶段提交失败的 Redis 补偿(恢复到没更新前的状态)
● 更新数据(先更新 mysql(不提交),再更新 Redis,再根据操作的结果决定是提交还是回滚)
● 事务 提交/回滚(Redis 补偿)

  • 提交/回滚 没有问题,释放分布式锁

这样做虽然能保持 mysql 与 Redis 的数据强一致,但是对于性能的影响非常大,所以一般不会使用
mysql 与 Redis 一般都是采用最终一致的方案(清除 Redis 数据等到下一次查询才最终一致)
不仅仅是 mysql 与 Redis,就算是mysql 主从之间,Redis 主从之间,以及其他分布式数据一致性的场景都不会使用强一致的方案,为了保证服务的性能都会采用最终一致的方案

思考:共识算法能实现强一致吗?怎么工作的?

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

游戏市场成果及趋势

2024 年的游戏行业发展情况如何?这是一个既关系到开发商,又关系到玩家的问题,而市场分析师可以为我们揭晓答案。下面,就让我们来看看分析师给出的结论以及他们对未来趋势的预测。 玩家 自 2021 年起,全球平均游戏时间…

Java版-oracle数据库连接测试工具-Maven配置JDBC

一、目标: 1)数据迁移方案,原RAC,新RAC 2)关闭原RAC环境,修改新RAC环境的IP=原RAC环境的IP,优点:所有的应用端不用修改数据库连接字符串。 3)测试工具目标: 3.1 Java程序,运行后cmd窗口, 3.2 链接原RAC数据库IP,每2秒查询并显示数据; 3.3 关闭/断掉原RAC服务器,…

微信小程序实现个人中心页面

文章目录 1. 官方文档教程2. 编写静态页面3. 关于作者其它项目视频教程介绍 1. 官方文档教程 https://developers.weixin.qq.com/miniprogram/dev/framework/ 2. 编写静态页面 mine.wxml布局文件 <!--index.wxml--> <navigation-bar title"个人中心" ba…

数据结构-ArrayLIst-一起探索顺序表的底层实现

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 大家好&#xff0c;我们今天来学习java数据结构的第一章ArrayList&#xff08;顺序表&#xff09; 1.ArrayList的概念 那小伙伴就要问了线性表到…

Unity2017 控制.abc格式的三维动画播放

首先需要导入插件Alembic&#xff0c;否则导入abc动画&#xff0c;Unity是不会识别的。 Unity2017版本及以下直接从我这儿下载&#xff1a;https://download.csdn.net/download/qq_41603955/90272382 高版本Unity&#xff0c;请移步AssetStore商店搜找。 导入abc之后&#x…

docker虚拟机平台未启用问题

在终端中输入如下代码&#xff0c;重启电脑即可 Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform 对于Docker Desktop - Unexpected WSL error问题 参考链接 解决WSL2与docker冲突问题

软件设计大致步骤

由于近期在做软件架构设计&#xff0c;这里总结下大致的设计流程 软件设计流程 1 首先要先写系统架构图&#xff0c;将该功能在整个系统的位置以及和大致的内部模块划分 2 然后写内部的结构图&#xff0c;讲内部的各个子系统&#xff0c;模块&#xff0c;组件之间的关系和调用…

EasyLine(v2.0)自制光谱、曲线处理软件

前言&#xff1a;因为这次更新对软件的整体变动较大&#xff0c;所以就没有取版本v1.1&#xff0c;而是直接使用v2.0版本。然后上一版的讲解也不是很清楚&#xff0c;这次也做重点讲解一下。 自制光谱、曲线处理软件-EasyLine 软件的安装软件的使用总体介绍文件格式处理的使用 …

赛灵思(Xilinx)公司Artix-7系列FPGA

苦难从不值得歌颂&#xff0c;在苦难中萃取的坚韧才值得珍视&#xff1b; 痛苦同样不必美化&#xff0c;从痛苦中开掘出希望才是壮举。 没有人是绝对意义的主角&#xff0c; 但每个人又都是自己生活剧本里的英雄。滑雪&#xff0c;是姿态优雅的“贴地飞行”&#xff0c;也有着成…

晨辉面试抽签和评分管理系统之八:随机编排考生的面试批次(以教师资格考试面试为例)

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

LeetCode热题100(三十四) —— 23.合并K个升序链表

LeetCode热题100&#xff08;三十四&#xff09; —— 23.合并K个升序链表 题目描述代码实现思路一&#xff1a;选择排序(199ms)思路二&#xff1a;归并排序(2ms) 思路解析 你好&#xff0c;我是杨十一&#xff0c;一名热爱健身的程序员在Coding的征程中&#xff0c;不断探索与…

深入理解 ECMAScript 2024 新特性:字符串 isWellFormed 方法

ECMAScript 2024 引入了一个新的字符串实例方法&#xff1a;String.prototype.isWellFormed。这一新增功能是为了帮助开发者更容易地验证字符串是否为有效的 Unicode 文本。本文将详细介绍这一方法的使用场景、实现原理及其在实际应用中的价值。 String.prototype.isWellFormed…

Springboot和Es整合

说明&#xff1a;本文章主要是简单整合和简单增删改查。 1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

阀井可燃气体监测仪,开启地下管网安全新篇章-旭华智能

在城市的脉络中&#xff0c;地下管网犹如隐秘的动脉&#xff0c;支撑着现代生活的运转。而在这庞大网络的关键节点上&#xff0c;阀井扮演着不可或缺的角色。然而&#xff0c;由于其密闭性和复杂性&#xff0c;阀井内部一旦发生可燃气体泄漏&#xff0c;将对公共安全构成严重威…

C#中通道(Channels)的应用之(生产者-消费者模式)

一.生产者-消费者模式概述 生产者-消费者模式是一种经典的设计模式&#xff0c;它将数据的生成&#xff08;生产者&#xff09;和处理&#xff08;消费者&#xff09;分离到不同的模块或线程中。这种模式的核心在于一个共享的缓冲区&#xff0c;生产者将数据放入缓冲区&#x…

4.寻找两个正序数组的中位数--力扣

给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,3], nums2 [2] 输出&#xff1a;2.00000 解释&…

2Spark Core

2Spark Core 1.RDD 详解1) 为什么要有 RDD?2) RDD 是什么?3) RDD 主要属性 2.RDD-API1) RDD 的创建方式2) RDD 的算子分类3) Transformation 转换算子4) Action 动作算子 3. RDD 的持久化/缓存4. RDD 容错机制 Checkpoint5. RDD 依赖关系1) 宽窄依赖2) 为什么要设计宽窄依赖 …

面试题刷题

i 或 i 基础几个9&#xff08;评价系统的指标&#xff09; Arrays.aslist 的bug 方法做了重写 这样就能使用了 list的迭代器 不能使用list.remove方法。需要使用迭代器的remove方法 正确操作 Hashcode hashcode是object对象的方法 是一个native方法 hashcode冲突案例和hashcod…

编译pytorch——cuda-toolkit-nvcc

链接 https://blog.csdn.net/wjinjie/article/details/108997692https://docs.nvidia.com/cuda/cuda-installation-guide-linux/#switching-between-driver-module-flavorshttps://forums.developer.nvidia.com/t/can-not-load-nvidia-drivers-on-ubuntu-22-10/239750https://…

Linux网络_套接字_UDP网络_TCP网络

一.UDP网络 1.socket()创建套接字 #include<sys/socket.h> int socket(int domain, int type, int protocol);domain (地址族): AF_INET网络 AF_UNIX本地 AF_INET&#xff1a;IPv4 地址族&#xff0c;适用于 IPv4 协议。用于网络通信AF_INET6&#xff1a;IPv6 地址族&a…