【Redis】Redis事务工作原理解析与分布式事务实战(Redis专栏启动)

news2024/11/23 8:46:43

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。

        

📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。

        

🏆 CSDN博客专家/后端领域优质创作者/内容合伙人、InfoQ签约作者、阿里云专家/签约博主、51CTO专家 🏆

        

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~ 


专栏系列(点击解锁)

学习路线(点击解锁)

知识定位

🔥MySQL从入门到精通🔥

MySQL从入门到精通

全面讲解MySQL知识与实战

🔥计算机底层原理🔥

深入理解计算机系统CSAPP

构件计算机体系和计算机思维

Linux内核源码解析

围绕Linux内核讲解计算机底层原理与并发

🔥数据结构与企业题库精讲🔥

数据结构与企业题库精讲

结合工作经验深入浅出,适合各层次,笔试面试算法题精讲

🔥互联网架构分析与实战🔥

企业系统架构分析实践与落地

行业前沿视角,专注于技术架构升级路线、架构实践

互联网企业防资损实践

金融公司的防资损方法论、代码与实践。

本文目录

本文导读

一、什么是Redis事务

二、Redis事务的特点

1、Redis事务没有隔离级别的概念

2、Redis不保证原子性

3、Redis 不支持回滚事务

4、Redis事务一致性consistency

5、Redis事务隔离性Isolation

6、Redis事务持久性Durability

三、Redis事务实战

1、Redis 事务语法 

2、Redis事务实现

四、Redis事务执行原理

1、Redis事务执行原理​​​​​​​

2、watch实现监控原理

总结


本文导读

本文主要讲解Redis事务工作原理解析与实战,包括什么是Redis事务,Redis事务的特点,例如Redis事务没有隔离级别的概念、不保证原子性、不支持回滚事务等等,Redis事务实战的语法、实现,Redis事务执行的底层原理以及watch实现监控原理。

一、什么是Redis事务

事务本身是支持同时执行多个命令的集合。事务中的所有命令都将被序列化(串行化),在事务执行期间,队列中的命令将按顺序连续执行,其他客户端提交的命令请求将不会插入到事务执行命令序列中。

Redis事务的本质是命令的集合,同时也具有顺序性、排他性,可以一次执行多个命令。

二、Redis事务的特点

1、Redis事务没有隔离级别的概念

批量操作在发送 EXEC 命令前被放入队列缓存,并不会被实际执行,也就不存在事务内的查询要看到事务里的更新,事务外查询不能看到。

2、Redis不保证原子性

Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。

3、Redis 不支持回滚事务

What about rollbacks?Redis does not support rollbacks of transactions since supporting rollbacks would have a significant impact on the simplicity and performance of Redis.

https://redis.io/docs/manual/transactions/

Redis 在事务失败时不进行回滚,而是继续执行余下的命令。Redis命令只会由于语法错误或者命令使用在错误类型的键上失败。因为支持回滚会对Redis的简单性和性能产生重大影响,所有不需要对回滚进行支持,Redis 的内部可以保持简单且快速。

4、Redis事务一致性consistency

Redis事务可以确保在命令失败时回滚,数据可以恢复到执行前的状态,除非Redis进程意外终止。

5、Redis事务隔离性Isolation

Redis事务严格遵守隔离,因为Redis是单进程和单线程模式,可以确保命令执行过程不会被其他客户端命令中断。然而,Redis不像其他结构化数据库那样具有隔离级别设计。 

6、Redis事务持久性Durability

Redis事务不能保证持久性。这是因为RDB和AOF在Redis持久性策略中都是异步执行的。出于性能考虑,无法保证持久性。

三、Redis事务实战

1、Redis 事务语法 

一个事务从开始到执行会经历以下三个阶段:开始事务、命令入队、执行事务。

Redis提供了以下5个基本指令,MULTI、EXEC、DISCARD、WATCH、UNWATCH。

命令

格式

作用

返回值

MULTI

MULTI

标记一个事务块的开始。

显式开启Redis事务,后续命令将排队,等候使用EXEC进行原子执行

always OK.

EXEC

EXEC

执行所有事务块内的命令。

执行事务中的commands队列,恢复连接状态。如果WATCH在之前被调用,只有监测中的Keys没有被修改,命令才会被执行,否则停止执行(详见下文,CAS机制)

成功: 返回数组 —— 每个元素对应着原子事务中一个 command的返回结果;
失败: 返回NULL(Ruby 返回nil);

DISCARD

DISCARD

取消事务,放弃执行事务块内的所有命令。

清除事务中的commands队列,恢复连接状态。如果WATCH在之前被调用,释放监测中的Keys

always OK.

WATCH

WATCH key [key ...]

监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

将给出的Keys标记为监测态,作为事务执行的条件

always OK.

UNWATCH

UNWATCH

取消 WATCH 命令对所有 key 的监视。

清除事务中Keys的监测态,如果调用了EXEC或者 DISCARD,则没有必要再手动调用UNWATCH

always OK.

开启并执行事务

# 开启事务
MULTI
# 命令入队
set key1 1
set key2 2
# 执行事务
EXEC

开启并取消事务

# 开启事务
MULTI
# 命令入队
set key1 1
set key2 3
# 取消事务
DISCARD
# 观察数据未被改动
get key2

WATCH监控

# 事务开始前用WATCH监控k1
WATCH k1
set k1 11

# 开启事务
MULTI
# 修改k1值
set k1 v1
# 执行事务,发回nil,说明事务回滚
EXEC
(nil)

get k1
"11"

2、Redis事务实现

基于Lua脚本,Redis可以确保脚本中的命令以一次性和顺序的方式执行。同时,它不提供事务运行错误的回滚。如果某些命令在执行过程中运行不正确,其余命令将继续运行

基于中间标记变量,使用另一个标记变量来标识事务是否完成。读取数据时,首先读取标记变量以确定事务是否完成。然而,这将需要额外的代码来实现,这很麻烦

四、Redis事务执行原理

1、Redis事务执行原理​​​​​​​​​​​​​​

当客户端切换到事务状态时,服务器将根据客户端发送的不同命令执行不同的操作:如果客户端发送的命令是EXEC、DISCARD、WATCH和MULTI之一,服务器将立即执行该命令。

相反,如果客户端发送的命令不是EXEC、DISCARD、WATCH和MULTI,则服务器不会立即执行该命令,而是将该命令放置在事务队列中,然后向客户端返回QUEUED应答。

2、watch实现监控原理

WATCH命令可以为Redis事务提供检查和设置 check-and-set (CAS)行为。监控WATCH键,以查看它们是否已更改。

如果在执行EXEC之前至少修改了一个受监控的密钥,则整个事务将被取消。EXEC返回 nil,表示事务已失败。如果另一个客户端在WATCH之后和EXEC之前修改键值,则当前客户端的事务将失败。

程序需要做的是重试操作,直到没有冲突。这种类型的锁被称为乐观锁,在大多数情况下,不同的客户端将访问不同的密钥,并且很少发生冲突,因此通常不需要重试。

Redis 使用 WATCH 命令来决定事务是继续执行还是回滚,在这种情况下,您需要在 MULTI 之前使用WATCH监视某些键值对,然后使用 MULTI 命令启动事务并执行数据结构操作的各种命令。此时,这些命令将排队。

当EXEC用于执行事务时,它将首先比较 WATCH 监视的键值对。如果没有更改,它将执行事务队列中的命令并提交事务;如果发生更改,将不会执行事务中的任何命令,并且将回滚事务。当然,无论是否回滚,Redis 都会在事务之前取消 WATCH 命令。

总结​​​​​​​

本文主要讲解Redis事务工作原理解析与实战,包括什么是Redis事务,Redis事务的特点,例如Redis事务没有隔离级别的概念、不保证原子性、不支持回滚事务等等,Redis事务实战的语法、实现,Redis事务执行的底层原理以及watch实现监控原理。 

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

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

相关文章

8.Django大型电商项目之商品添加分页

1.添加分页 添加分页在Django中使用自带分页器paginator 1.1 配置setting settings中配置分页数量 # 每页显示记录条数 PER_PAGE_NUMBER 81.2 配置views 完成分页栏使用paginator创建对象,返回选中条数 from django.shortcuts import render from goodsapp.mo…

桶排序算法

题目 代码1&#xff1a; #include <stdio.h> int main() {int sz0;scanf("%d",&sz);int arr[sz];//输入int i0;for (i0;i<sz;i){scanf("%d",&arr[i]);}//删除多余相同元素int j0;int k0;for (i0;i<sz;i){if (i0){arr[j]arr[i];}else{…

MyBatis批量保存(Oracle)MyBatis批量插入时,组装SQL过长会有问题,一定要根据批量插入数据量进行切割,再批次提交保存!!!

MyBatis批量保存&#xff08;Oracle&#xff09; oracle 批量插入与mysql 的批量插入的方式不同 insert into tablename()values(),(),(); ---这个是mysql 的批量插入形式 insert all into tablename() values() into tablename() values() -------这个是Oracle批量插入形式 你…

大数据测试 - 数仓测试

前言 对于数据仓库的测试来说底层的系统会有很多有自建的集群使用 spark 或者 flink 测试&#xff0c;也有很多直接使用云厂商的产品比如 datworks 等等&#xff0c;再这里我想分享下抛开环境&#xff0c;只对数据仓库测试的一些小心得。 数仓分层设计 标准数仓分为 ODS,DWD…

java计算机毕业设计基于安卓Android的微整形美容app

项目介绍 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设…

前缀和问题

前缀和 一维二维 ac795. 前缀和【一维】 输入一个长度为 nn 的整数序列。 接下来再输入 mm 个询问&#xff0c;每个询问输入一对 l,rl,r。 对于每个询问&#xff0c;输出原序列中从第 ll 个数到第 rr 个数的和。 输入格式 第一行包含两个整数 nn 和 mm。 第二行包含 nn…

基于android的资源文件管理器

软 件 学 院 毕业实训报告 课题名称&#xff1a; android资源管理器 专 业&#xff1a; 软件设计&#xff08;游戏开发方向&#xff09; 班 级&#xff1a; 学 号&#xff1a; 学生姓名&#xff1a; 指导教师&#xff1a; 年 月 日 摘 要 相信大家对Android的发展历史…

Nacos-配置中心,特性,启动,集成mysql,快速入门

Nacos - 配置管理 目录Nacos - 配置管理1. 什么是配置中心1.1 什么是配置1.2 什么是配置中心2 Nacos****简介2.1 主流配置中心对比2.2 Nacos****简介2.3 Nacos****特性3 Nacos 快速入3.1 安装 Nacos Server3.1.1 预备环境准备3.1.2 下载源码或者安装包3.1.3 启动服务器3.1.4 OP…

HTML班级网页设计 基于HTML+CSS+JS制作我们的班级网页(web前端学生网页设计作品)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

计算机毕业设计---java+springboot宠物商城系统

一、项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot Maven mybatis Vue 等等组成&#xff0c;B/…

光栅尺差分计数/频率5MHz/磁栅尺编码器差分脉冲计数采集模块

产品特点&#xff1a; ● 光栅尺磁栅尺解码转换成标准Modbus RTU协议 ● 光栅尺5V差分信号直接输入&#xff0c;4倍频计数 ● 模块可以输出5V的电源给光栅尺供电 ● 高速光栅尺磁栅尺计数&#xff0c;频率可达5MHz ● 支持4个光栅尺同时计数&#xff0c;可识别正反转 ● …

Oracle函数

目录 一、数值函数 1.ABS(value)&#xff1a;绝对值 2.CEIL(value)&#xff1a;向上取整 3.FLOOR(value)&#xff1a;向下取整 4.ROUND(value)&#xff1a;四舍五入 5.MOD(value(被除数),divisor(除数))&#xff1a;求模 6.SIGN(value)&#xff1a;判断正(0)负(-1)和零(…

隐私计算学习笔记

目录 安全保护技术和应用总结 基础隐私计算技术在联邦学习中的应用 参考书籍 图片来源&#xff1a; https://www.basebit.ai/en/Statics/Images/en/dbys.png 隐私计算技术的产生是互联网、大数据以及区块链等技术发展到一定阶段的必然成果&#xff0c;以下为大家分享读书笔…

01-32-spring5-bean-ioc-aop

01-spring5&#xff1a; spring 1、spring概念 1、什么是spring及优点 Spring框架使Java EE应用程序的开发更加简捷&#xff0c;通过使用POJO为基础的编程模型促进良好的编程风格。 轻量级&#xff1a;Spring在大小和透明性方面绝对属于轻量级的&#xff0c;基础版本的Spr…

【推荐系统学习笔记】-- 2、特征工程

1、可利用的特征 1.1 用户行为特征 显性反馈行为&#xff1a;点赞、评分、评价等隐形反馈行为&#xff1a;点击、浏览、播放、加入购物车等 1.2 用户关系数据 显性&#xff1a;关注、好友关系隐形&#xff1a;点赞、共同观影使用Graph Embedding生成用户和物品的Embedding …

[附源码]Python计算机毕业设计SSM基于web的托育园管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

蓝牙遥控小车基础篇

开发环境&#xff1a; STM32F103R8T6最小系统板&#xff08;IO顺序引出&#xff09; 3D建模蓝牙遥控小车STL 蓝牙遥控小车纯HAL库代码 TP-Bluetooth-Car.apk蓝牙apk 原理&#xff1a;&#xff08;写代码前必须要知道模块的参数&#xff09; 蓝牙模块HC-05使用指南 HC-05蓝…

C++入门——函数重载

C入门——函数重载与缺省 先说说什么是缺省 大家生活中都知道什么关于缺省这个词的例子吗&#xff1f; 肯定是一头雾水&#xff0c;没事我举一个例子&#xff0c;给大家解释一下。 假如小菜是一个舔狗&#xff0c;他天天跟女神买早餐、嘘寒问暖。可是女神还是天天不为所动&am…

基于LabVIEW单片机的抢答器的设计

实训题目&#xff1a;基于LabVIEW单片机的抢答器的设计 1 系统设计 1.1 设计要求 1.1.1 设计任务 设计一个基于LABVIEW的6人抢答器&#xff0c;实现抢答器的基本功能。 1.1.2 性能指标要求 需要自己设计电路并焊接电路板。基本要求&#xff1a;有一个主持人控制开关和…