对 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…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
