Redis 事务是什么?又和MySQL事务有什么区别?

news2024/11/19 20:33:20

目录

1. Redis 事务的概念

2. Redis 事务和 MySQL事务的区别?

3. Redis 事务常用命令


1. Redis 事务的概念

下面是在 Redis 官网上找到的关于事务的解释,这里划重点,一组命令,一个步骤。

也就是说,在客户端与 Redis 交互的时候,一个步骤中执行一组命令,它们按照顺序执行而且执行过程中不会被其他命令加塞,必须一起执行完毕,就是 Redis 事务。

比如下面这两个 set 指令,本质上来说其实是和 Redis 交互的两次,所以它们其实是两次事务。

127.0.0.1:6379> set name1 "zhangsan"
OK
127.0.0.1:6379> set name2 "lisi"
OK

2. Redis 事务和 MySQL事务的区别?

(1)单独的隔离操作

Redis 事务仅仅保证事务里的操作会被连续独占的执行,Redis 命令执行是单线程架构,在执行事务内所有命令请求之前无法去执行其他客户端请求;

(2)没有隔离级别的概念

Redis 事务在提交之前任何指令都不会实际的被执行,所以不存在MySQL中脏写,脏读,不可重复读,幻读等问题;

(3)不保证原子性

Redis 事务不保证原子性,Redis 不能保证所有指令同时成功和失败,只能保证事务的指令一同执行,因为对于 Redis 来说,事务回滚带来的代价太大,影响性能;所以对于一个 Redis 事务来说,是有可能出现部分指令执行成功但部分指令执行失败的;

(4)排它性

Redis 在执行事务的过程中,能保证事务内的命令依次执行不被其他命令插入;

3. Redis 事务常用命令

MULTI:标记一个事务快的开始;

EXEC:执行事务块中的所有命令;

DISCARD:取消事务,放弃执行事务块中的所有命令;

UNWATCH:取消 WATCH 命令对所有 key 的监控;

WATCH key [key...]:监控一个或多个key,如果事务执行之前这些key被其他事务改动,事务就会被打断;

示例1(事务正常提交)

使用 multi 命令开始一个事务,可以看到客户段上都标记有 "TX" 事务的标志,在陆续添加 k1,k2,k3之后,并没有显示执行成功,而是返回一个QUEUED,这是队列的意思,也就是说开启事务之后,Redis 将所有需要的命令放到了一个队列中,在执行 EXEC 操作之后,会将队列中的命令全部执行;

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
3) OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> get k3
"v3"

示例二(取消事务): 

先存放一个 age 为24的值,然后开启事务,在使用DISCARD取消事务命令,我们再次 get age,取到的还是原来的 24,不是事务中希望添加的 20,即事务未执行。

127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> mulit
(error) ERR unknown command 'mulit', with args beginning with: 
127.0.0.1:6379> set age 24
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set age 20
QUEUED
127.0.0.1:6379(TX)> discard
OK
127.0.0.1:6379> get age
"24"

示例三(EXEC 之前错误,类似于编译时异常):

其实这个有点类似于 Java 中的编译时异常,就是再添加命令到事务队列中的时候命令是错的,redis 会检查出来,并将队列中的所有操作全部返回,就是不执行的意思,不是回滚,回滚是执行过但是又退回来,这里是根本没有执行,小伙伴们一定要分清楚哦

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set name jack
QUEUED
127.0.0.1:6379(TX)> set username
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
// EXCEABORT翻译过来就是打断EXEC提交命令
127.0.0.1:6379> get name
(nil)

示例四(EXEC 之后出现错误,类似于运行时异常):

第一步,开启一个事物,存放一个数字类型的值num1和字符串的值email;

第二步,get 获取 num1 和 email ,能获取到,说明存放成功;

第三步,对num1使用 incr 命令使其自增1,对 email 也是用 incr 命令使其自增1;

从语法上来讲,所有命令本身并没有错误,所以 redis 是检查不出来的,但是在逻辑上我们不能让字符串类型的数据自增1,所以 incr email 这个命令时执行失败的,但是其他命令都没有问题,是可以正常执行的,这就是 redis 于 MySQL最大的区别,MySQL是同成功同失败,redis 则是能执行成功的就会保存不进行回滚,执行失败的那就是失败了。

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set num1 1000
QUEUED
127.0.0.1:6379(TX)> set email 12345@qq.com
QUEUED
127.0.0.1:6379(TX)> get num1
QUEUED
127.0.0.1:6379(TX)> get email
QUEUED
127.0.0.1:6379(TX)> incr num1
QUEUED
127.0.0.1:6379(TX)> incr email
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
3) "1000"
4) "12345@qq.com"
5) (integer) 1001
6) (error) ERR value is not an integer or out of range

补充一点:WATCH 底层采用的是CAS乐观锁,如果我们使用WATCH监控了一些 key,那么在事务中在执行修改这些被监控的 key 数据的时候,会判断当前 key 的值是否与期望值一样,如果一样就会做修改,如果不一样就会放弃修改,当前整个事务的操作都会放弃执行。

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

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

相关文章

synchronized jvm实现思考

底层实现时,为什么使用了cxq队列和entryList双向链表?这里为什么不跟AQS中使用一个队列就行了,加了一个entryList的目的是为了什么? 个人理解这里多一个entryList,可能是用于减少频繁的cas操作。假设存在很多锁竞争时&…

vue项目修改字体为苹方

vue项目修改字体为苹方 在项目assets中创建字体文件夹fonts,在文件夹中添加字体文件 在fonts底下创建css文件 font.css font-face {font-family: PingFang;src: url(./PingFang.ttf);font-weight: normal;font-style: normal; }需要在全局样式中引入,a…

网络安全准入技术之MAC VLAN

网络准入控制作为主要保障企业网络基础设施的安全的措施,特别是对于中大型企业来说,终端类型多样数量激增、终端管理任务重难度大、成本高。 在这样的一个大背景下,拥有更灵活的动态识别、认证、访问控制等成为了企业网络安全的最核心诉求之…

自定义GPT已经出现,并将影响人工智能的一切,做好被挑战的准备了吗?

原创 | 文 BFT机器人 OpenAI凭借最新突破:定制GPT站在创新的最前沿。预示着个性化数字协助的新时代到来,ChatGPT以前所未有的精度来满足个人需求和专业需求。 从本质上讲,自定义GPT是之前的ChatGPT的高度专业化版本或代理,但自定…

方阵的施密特正交化与相似对角化

方阵的施密特正交化与相似对角化 施密特正交化 施密特正交化步骤 example 略 相似对角化 相似对角化步骤 step1: step2: step3: step4: example 注:特征值的个数与秩无关 A {{-3, 6}, {-10, 6}}; Eigenvalues[A] V Eigenvectors[A]; P {V[[1]], V[[2]]}; P Transpo…

做一个Springboot文件上传-阿里云

概述 这个模块是用来上传头像以及文章封面的,图片的值是一个地址字符串,一般存放在本地或阿里云服务中 1、本地文件上传 我们将文件保存在一个本地的文件夹下,由于可能两个人上传不同图片但是却同名的图片,那么就会一个人的图片就…

ArkUI实战,深入浅出OpenHarmony应用开发

前言 | 《ArkUI实战》《ArkUI实战》深入浅出的介绍了OpenHarmony开发框架ArkUI组件的使用和应用开发流程,是OpenHarmony应用开发的必备电子书。https://www.arkui.club/ OpenHarmony开发资料归档__南先森-Laval社区OpenHarmony入门看这里 _南先森 Laval社区https:/…

Vue.js的生命周期钩子

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

DAY53 1143.最长公共子序列 + 1035.不相交的线 + 53. 最大子序和

1143.最长公共子序列 题目要求:给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删…

Android图片压缩插件

今天才发现这个还有插件,平时都是传网站上压缩完了又下载下来覆盖原文件。现在有这个了,开发好高效😁!分享给大家,可能对你们有用哈哈😆。也可能你们早都知道了……

信息系统项目管理师(第四版)教材精读思维导图-第十五章到二十四章

请参阅我的另一篇文章,综合介绍软考高项: 信息系统项目管理师(软考高项)备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 ​ 思维导图源文件下载链接: 十五章风险管理 十六章采购管理 十七章干系人管理…

如何驾驭逻辑、形式逻辑与AI算法?

逻辑错误与逻辑形式错误是有区别的: 逻辑错误经常表现为没有逻辑因果,用辩证法、阴谋论和统计归纳替代因果演绎;而逻辑形式错误是:前提是形式和内容需要分离,就像数学与语文分开,数学代表形式,…

技术贴 | SQL 执行 - 执行器优化

本期技术贴主要介绍查询执行引擎的优化。查询执行引擎负责将 SQL 优化器生成的执行计划进行解释,通过任务调度执行从存储引擎里面把数据读取出来,计算出结果集,然后返回给客户。 在关系型数据库发展的早期,受制于计算机 IO 能力的…

SLF4J: Class path contains multiple SLF4J bindings.

问题截图 问题原因 这里就是由于hbase 安装路径下的一个文件和hadoop安装路径下的文件起冲突了 解决办法 我的路径: 这个一定要看自己电脑上的路径 /usr/local/hbase/lib/client-facing-thirdparty/ slf4j-log4j12-1.7.25.jar更名为: /usr/local/hb…

手把手带你学习 JavaScript 的 ES6 ~ ESn

文章目录 一、引言二、了解 ES6~ESn 的新特性三、掌握 ES6~ESn 的用法和实现原理四、深入挖掘和拓展《深入理解现代JavaScript》编辑推荐内容简介作者简介精彩书评目录 一、引言 JavaScript 是一种广泛使用的网络编程语言,它在前端开发中扮演着重要角色。随着时间的…

Python | 机器学习之聚类算法

​🌈个人主页:Sarapines Programmer🔥 系列专栏:《人工智能奇遇记》🔖少年有梦不应止于心动,更要付诸行动。 目录结构 1. 机器学习之聚类算法概念 1.1 机器学习 1.2 聚类算法 2. 聚类算法 2.1 实验目的…

基于Vue+SpringBoot的天然气工程业务管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目详细录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程…

MAT工具定位分析Java堆内存泄漏问题方法

原创/朱季谦 一、MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题。该工具提供了两种使用方式,一种是插件版,可以安装到Eclipse使用,另一种是独立版…

Kibana:作为非设计师设计直观的 Kibana 仪表板

作者:Carly Richmond, Marco Vettorello, Giovanni Magni 开发人员、SRE 工程师和才华横溢的技术人员通常需要构建快速仪表板来展示有关其应用程序状态的重要信息,这些信息可供混合受众使用。 如果你不是前端开发人员或设计师,那么构建所有人…

【Mysql】MySQL基于成本的优化

什么是成本 我们之前说 过MySQL 执行一个查询可以有不同的执行方案,它会选择其中成本最低,或者说代价最低的那种方案去真正的执行查询。那么成本是怎么计算的呢,其实在 MySQL 中一条查询语句的执行成本是由下边这两个方面组成的: I/O 成本 …