对 Redis 实现分布式事务的探索与实现
对 Redis 实现分布式事务的探索与实现
- 一、简介
- 简介
- 优势
- 二、Redis 的事务机制
- 事务
- WATCH 命令
- MULTI 命令
- EXEC 命令
- UNWATCH 命令
- 三、Redis 的分布式事务
- 集群架构
- 分布式事务
- 分布式事务实现方式
- 1. 两阶段提交(2PC)方式
- Paxos 算法实现方式
- Raft 算法实现方式
- 四、实例分析
- 场景描述
- 基于 2PC 方式实现 Redis 分布式事务的详细步骤
- 基于 Paxos 算法实现 Redis 分布式事务的详细步骤
- 基于 Raft 算法实现 Redis 分布式事务的详细步骤
一、简介
简介
Redis是一个高性能的key-value型NoSQL数据库系统,它被广泛应用于缓存、队列、计数器等场景中。
优势
Redis的优势主要体现在以下几个方面:
- 高性能:Redis的读写速度非常快,单机能处理高达10万QPS的请求。
- 支持多种数据结构:Redis不仅支持基本的字符串、列表和哈希等数据结构,还支持有序集合和位图等高级数据结构。
- 操作简单:Redis提供了易于使用的命令行工具,使得对Redis进行操作变得非常简单。
- 数据持久性:Redis可以将数据存储到磁盘上,确保数据的持久性。
二、Redis 的事务机制
事务
Redis的事务机制是通过MULTI、EXEC、DISCARD和WATCH这四个命令实现的。其特点如下:
- 原子性:Redis的事务是原子性的,即事务中的多个请求要么全部执行成功,要么全部执行失败,不存在部分成功或失败的情况。
- 隔离性:Redis的事务具有隔离性,即事务之间是相互独立的,事务之间的操作不会相互影响。
- 一致性:Redis的事务保证数据一致性,即在事务执行过程中,数据始终符合事务开始时的状态和事务结束后的状态。
- 持久性:Redis的事务满足持久性,即当事务执行成功后,数据会被持久化到磁盘中。
WATCH 命令
WATCH命令负责监视一个或多个键值对,当这些键值对在事务执行期间发生了变化,整个事务都将被取消。具体原理如下:
- 执行WATCH命令时,Redis将该客户端和指定的键值对关联在一起。
- 在执行MULTI命令前,若有其他客户端修改了WATCH监视的任何一个键值对,此时执行EXEC命令,则整个事务会被取消。
- 监视的键值对将在本次事务开启之前的所有操作的结果上进行计算。
MULTI 命令
MULTI命令用于开启一个事务,它将客户端的状态设置为事务状态,从而使得后面发送的所有命令都会被缓存在服务器端。实际上,Redis并不会立刻执行这些命令,而是等待执行EXEC命令时才会将缓存的所有命令一次性执行。具体原理如下:
- 执行MULTI命令时,Redis将该客户端的状态设置为事务状态。
- 当客户端在事务状态下发送命令时,Redis并不会立即执行命令,而是将所有命令缓存到服务器端。
- 当客户端发送EXEC命令时,Redis会将所有缓存命令一次性执行,并清空客户端的事务状态。
EXEC 命令
EXEC命令用于提交一个事务,它将缓存在服务器端的命令一次性执行。如果事务中的任何一个命令出现了错误,那么整个事务都会被回滚,需要重新开始。实际上,Redis会将事务中的所有命令放到一个队列中,在执行这些命令之前还需要进行一些其他的判断,确保事务的正确性。具体原理如下:
- 执行EXEC命令时,Redis会将客户端状态设为提交状态。
- Redis会对缓存的所有命令进行检查,确保这些命令可以正确地执行。
- 如果有任何一个命令出现了错误,Redis会撤销缓存的所有命令,事务也会被回滚。
- 如果所有的命令都没有出现错误,Redis会执行缓存的所有命令。
UNWATCH 命令
UNWATCH命令用于取消一个客户端所有被WATCH命令监视的键值对,使得该客户端从WATCH状态退出。具体原理如下:
- 执行UNWATCH命令时,Redis会将当前客户端与所有被WATCH命令监视的键值对之间的关联断开。
- 执行UNWATCH命令后,该客户端将不再处于WATCH状态。
三、Redis 的分布式事务
集群架构
Redis集群是一个分布式数据库解决方案。它允许将数据分布到不同的Redis实例上,从而保证在高可用性和可扩展性方面具有显著的优势。Redis集群的主要组成部分为:节点、故障转移、插槽、集群状态、Gossip协议等。
分布式事务
Redis在单个实例上提供了一个原子的事务执行过程,即通过MULTI,EXEC,WATCH等操作进行控制。然而,在Redis集群中,由于数据已被分成多个片段并在不同的节点上存储,并且Redis没有提供全局事务控制机制。因此,必须采取不同的方法来处理分布式事务。
Redis分布式事务的基本思路是,通过协调所有相关节点的操作,实现跨节点的原子性操作。Redis通过支持一些分布式事务实现方式来解决这个问题。
分布式事务实现方式
1. 两阶段提交(2PC)方式
在分布式系统中,2PC可以用于跨多个节点管理事务。2PC算法分为两个阶段:提交请求阶段和提交决定阶段。在第一阶段中,协调器触发Transaction和询问所有参与者是否可以提交该Transaction。如果所有节点都同意提交Transaction,那么在第二阶段中,协调器从参与的所有节点中收集提交意见,并根据他们的反馈决定是否执行该事务。如果有任何参与者没有投票,或者协调器收到拒绝的答案,则事务将被取消。
Paxos 算法实现方式
Paxos算法是一种用于解决分布式一致性问题的算法。在一个典型的Paxos算法实现中,客户端向提案者发送请求。提案者将提案发送给所有接受者并等待答复。如果多数接受者认可这个提案,那么提案就可以被批准。
这种方法需要将Redis节点推荐为提案者,并使用其共识机制在集群中选择大部分意见来确定最终结果。
Raft 算法实现方式
Raft算法是一种复制日志技术,用于管理可扩展的、高度可用的分布式系统。在Raft算法中,每个服务器可以处于三种不同的状态之一:跟随者、候选人或领导者。
该方法使用Redis节点作为Raft服务器,并按照Raft算法规则进行投票决策,从而确保在节点崩溃时仍然保持数据一致性和可用性。
四、实例分析
场景描述
假设我们的系统需要调用Redis集群进行一系列的增删改查数据操作。在这个过程中,如果Redis集群中的任何节点出现故障,则必须回滚所有修改并返回错误码,以确保数据一致性并防止悬挂事务的发生。
基于 2PC 方式实现 Redis 分布式事务的详细步骤
- 应用程序在第一个Redis节点上启动事务,并向其他节点发送询问准备提交的请求。
- 编写相应的代码来处理事务是否可以被提交,然后在所有节点上对答案进行投票。
- 如果所有节点都已响应"可以提交",则节点将继续执行事务。
- 如果有节点拒绝,则请返回错误码并撤消所有先前的修改。
基于 Paxos 算法实现 Redis 分布式事务的详细步骤
- 应用程序向一个Redis节点提出命令。
- Redis节点将命令广播给所有节点。
- 每个节点都询问其他节点,以确定是否接受该命令。
- 如果大多数节点(即超过半数)同意执行该命令,那么命令就被批准。
- 每个节点执行批准的命令。
基于 Raft 算法实现 Redis 分布式事务的详细步骤
- 应用程序向Raft服务器发送命令请求。
- 服务器将该命令附加到其日志中,并将日志条目复制到所有其他服务器上。
- 多数投票的服务器将该日志附加到其日志中。
- 收到多数投票后,将修改应用于服务器状态机并返回状态表示成功。
相关文章:
对 Redis 实现分布式事务的探索与实现
对 Redis 实现分布式事务的探索与实现 一、简介简介优势 二、Redis 的事务机制事务WATCH 命令MULTI 命令EXEC 命令UNWATCH 命令 三、Redis 的分布式事务集群架构分布式事务分布式事务实现方式1. 两阶段提交(2PC)方式Paxos 算法实现方式Raft 算法实现方式…...
Matlab实现Spectral Clustering算法
Spectral Clustering算法是一种基于图论的聚类算法,它可以将数据点按照图结构进行划分,发现复杂和非线性可分的结构。在这篇博客中,我将介绍Spectral Clustering算法的原理和步骤,并给出一个用Matlab实现的代码示例。 目录 一、…...

Android 测试
工程目录图 1- Espresso 2- uiautomator Espresso 文档UI Automator文档ui-automator 英文文档 请点击下面工程名称,跳转到代码的仓库页面,将工程 下载下来 Demo Code 里有详细的注释 代码:testespresso 参考文献 Android 利用 espre…...

全面解析大语言模型的工作原理
当ChatGPT在去年秋天推出时,在科技行业乃至世界范围内引起了轰动。当时,机器学习研究人员尝试研发了多年的语言大模型(LLM),但普通大众并未十分关注,也没有意识到它们变得多强大。 如今,几乎每个…...

cmake+pybind11打包c++库成python wheel安装包
目录 写在前面准备1、pybind11获取源码编译安装 2、conda demo官方源码修改CMakeLists.txt编译生成安装测试 参考完 写在前面 1、本文内容 有时候我们需要用c代码,供python调用,本文提供将c库封装成python接口的方法,并将库打包成可通过pip安…...

史上最细,接口自动化测试框架-Pytest+Allure+Excel整理(代码)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Allure框架 Allu…...

【计算机视觉中的 GAN 】 - 条件图像合成和 3D 对象生成(2)
一、说明 上文 【计算机视觉中的 GAN 】或多或少是GANs,生成学习和计算机视觉的介绍。我们达到了在 128x128 图像中生成可区分图像特征的程度。但是,如果你真的想了解GAN在计算机视觉方面的进展,你肯定必须深入研究图像到图像的翻译。…...

智安网络|常见的网络安全陷阱:你是否掉入了其中?
在数字化时代,网络安全成为了一个重要的议题。随着我们越来越多地在互联网上进行各种活动,诸如在线银行交易、社交媒体分享和在线购物等,我们的个人信息也更容易受到攻击和滥用。虽然有许多关于网络安全的指导和建议,但仍然有许多…...

亚马逊云科技HPC解决方案,帮助浙江大学实现成本和科研任务的双丰收
浙江大学土壤学科是朱祖祥院士等几代土壤科学家共同创建的A国家重点学科,整体实力雄厚,优势特色明显,总体水平居国内前列。在亚马逊云科技科研创新支持计划(Amazon Web Services Cloud Credits for Research)的多次支持…...

【Docker】Docker中安装MySQL数据库
文章目录 1. 前言2. Docker中安装MySQL服务2.1. 查看可用的MySQL版本2.2. 拉取MySQL镜像2.3. 查看本地镜像2.4. 运行容器2.5. 查看正在运行的容器2.6. 查看容器内部2.7. 授权root远程登录2.8. 在宿主机连接到容器的MySQL2.9. 用Navicat连接容器的MySQL 3. 如果是MySQL8.0可能需…...
Unity的IPostBuildPlayerScriptDLLs:深入解析与实用案例
Unity IPostBuildPlayerScriptDLLs Unity IPostBuildPlayerScriptDLLs是Unity引擎中的一个非常有用的功能,它可以让开发者在构建项目后自定义哪些文件需要被复制到输出目录中。这个功能可以帮助开发者更好地控制项目的构建过程,确保输出目录只包含必要的…...

MySQL数据库服务器安装与配置(步骤简单详细,看完可学会下载MySQL所有版本)
目录 引言 一,5.6.51数据库服务器下载 二,8.1.0最新版数据库服务器下载 三,MySQL客户端下载 引言 个人认为MySQl数据库目前推荐的两个版本系列为5.6.51和8.系列。 至于我们为什么要下载两个版本呢?是因为官方在数据库下载的结构…...

PowerDesigner16.5安装教程
一、什么是PowerDesigner PowerDesigner是Sybase的企业建模和设计解决方案,采用模型驱动方法,将业务与IT结合起来,可帮助部署有效的企业体系架构,并为研发生命周期管理提供强大的分析与设计技术。PowerDesigner独具匠心地将多种标…...

Java反射全面详解
1. 什么是反射? 首先听这个名字就有些疑惑,什么是反射,它能用来干什么呢? Java官方对反射的解释是 "反射允许对封装类的字段,方法和构造函数进行编程式访问"。这里的字段指的就是成员变量,方法…...

助力工业物联网,工业大数据之费用事实指标分析及实现【二十四】
文章目录 1:费用事实指标分析及实现2:差旅事实指标分析及实现3:网点物料事实指标分析及实现 1:费用事实指标分析及实现 目标:实现DWB层费用报销事实指标表的构建 路径 step1:目标需求step2:数据…...

Istio 安全 mTLS认证 PeerAuthentication
这里定义了访问www.ck8s.com可以使用http也可以使用https访问,两种方式都可以访问。 那么是否可以强制使用mtls方式去访问? mTLS认证 PeerAuthentication PeerAuthentication的主要作用是别人在和网格里的pod进行通信的时候,是否要求mTLS mTL…...

【MySQL】数据库基本使用
文章目录 一、数据库介绍二、数据库使用2.1 登录MySQL2.2 基本使用2.2.1 显示当前 MySQL 实例中所有的数据库列表2.2.2 创建数据库2.2.3 创建数据库表2.2.4 在表中插入数据2.2.5 在表中查询数据 三、服务器、数据库、表之间的关系四、SQL语句分类五、存储引擎 一、数据库介绍 …...
计算shell脚本执行的时间
我们在使用shell脚本进行一些批量活动的时候,在有的场景下会需要知道脚本执行用了多长的时间,一谈到这个话题,我们一般的想法就是记录时间再开始阶段,执行完成后再记录时间,然后求时间差,这样是可以的&…...
无网络环境下,如何部署Docker镜像
无网络环境下,如何部署Docker镜像 什么是Docker镜像 Docker镜像是Docker容器的基础构建块。它是一个轻量级、独立且可执行的软件包,其中包含了运行应用程序所需的所有文件系统、代码、依赖关系和配置。 Docker镜像由一系列只读层(Layers&a…...

瑞吉外卖项目----(2)缓存优化
1 缓存优化 1.0 问题说明 1.1 环境搭建 将项目推送到远程仓库里,教程在git 提交远程仓库前建议取消代码检查 创建新的分支v1.0(用于实现缓存优化)并推送到远程仓库 1.1.1 maven坐标 导入spring-data-redis的maven坐标: &l…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...