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

目录

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 的值是否与期望值一样,如果一样就会做修改,如果不一样就会放弃修改,当前整个事务的操作都会放弃执行。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python | 机器学习之聚类算法

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

Vue.js的生命周期钩子

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

GPT 学习法:恐怖算力 + 精确算法,实现复杂文献轻松的完美理解、在庞大的不确性中找到确定性

GPT 学习法:恐怖算力 精确算法,实现复杂文献轻松的完美理解、在庞大的不确性中找到确定性 复杂文献 - 恐怖算力 精确算法,复杂文献轻松的完美理解GPT 理解法 - 举例子、归纳、逻辑链推导本质、图示、概念放大器实战案例:学习高精…

DDR3内容相关

1、DDR3 全称第三代双倍速率同步动态随机存储器。 特点:①掉电无法保存数据,需要周期性的刷新。②时钟上升沿和下降沿都 会传输数据。③突发传输,突发长度 Burst Length 一般为 8。 2、DDR3 的存储:bank、行地址和列地址 数据怎么…

使用 Redis 构建轻量的向量数据库应用:图片搜索引擎(一)

本篇文章聊聊更轻量的向量数据库方案:Redis。 以及基于 Redis 来快速实现一个高性能的本地图片搜索引擎,在本地环境中,使用最慢的稠密向量检索方式来在一张万图片中查找你想要的图片,总花费时间都不到十分之一秒。 写在前面 接着…

⑨【MySQL事务】事务开启、提交、回滚,事务特性ACID,脏读、幻读、不可重复读。

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ MySQL事务 ⑨【事务】1. 事务概述2. 操作事务3…

2023年咨询实务速记突破【专题总结】

需要完整资料的可以联系我获取

xshell连接云服务器(保姆级教程)

文章目录 1. 前言2. 查看云服务器的信息3. xshell7连接云服务器 1. 前言 云服务器,也被称为Elastic Compute Service (ECS),是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。它源于物理服务器集群资源池,可以像从大海中取水一样&am…

【软考篇】中级软件设计师 第二部分(二)

中级软件设计师 第二部分(二) 十三. 死锁问题十四. 段页式存储14.1 页式存储14.1.1 缺页中断14.1.2 页面置换算法 14.2 段式存储14.3 段页式存储 十五. 索引文件十六. 文件目录16.1 树形目录结构16.2 位示图 十三. 死锁问题 多刷题 系统不可能发生死锁的…

【Linux】Linux基础IO(下)

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:Linux 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【Linux】…

智能供应链中的预测算法:理论与实践

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 引言 智能供应链已经成…

linux高级篇基础理论(详细文档)二

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技…

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

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

Live800:客服行业的发展历程及未来前景

随着信息技术和互联网的高速发展,客服行业也在不断变革和发展。客服行业是一个服务型的行业,其发展历程也与人们对服务需求的变化密切相关。本文将介绍客服行业的发展历程和未来前景。 客服行业的发展历程 20世纪70年代,客服行业主要以电话服…

SAM分割模型的5个典型用例

Meta AI 于2023 年推出的分割任意模型 (SAM) 彻底改变了我们对图像分割的质量标准。 给定输入图像,SAM 尝试分割图像中的所有对象并生成分割掩模。 使用 SAM,你可以分割对象,然后,可以使用模型来利用该信息,例如用于为…

【开源】基于Vue.js的校园二手交易系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目详细录屏 二、功能模块2.1 数据中心模块2.2 二手商品档案管理模块2.3 商品预约管理模块2.4 商品预定管理模块2.5 商品留言板管理模块2.6 商品资讯管理模块 三、实体类设计3.1 用户表3.2 二手商品表3.3 商品预约表3.4 商品预定表3.5 留言表3.6…

μC/OS-II---时间管理(os_time.c)

目录 时间管理相关(os_time.c)Task延迟按时、分、秒、毫秒延时恢复被延时的Task返回系统当前的Tick计数值设置系统的Tick计数值 时间管理相关(os_time.c) Task延迟 void OSTimeDly (INT32U ticks) {INT8U y; #if OS_CRITI…

Kibana:使用 “链接” 面板简化 Kibana 仪表板导航 - Links panel

作者:Teresa Alvarez Soler 我们很高兴地宣布 Kibana 仪表板的最新功能版本:链接面板(Links panel),这是在仪表板之间组织和导航的简单方法。 此功能在 Kibana 8.11 的技术预览版中提供。 有时你可能希望创建多个主题…

Rust实战教程:构建您的第一个应用

大家好!我是lincyang。 今天,我们将一起动手实践,通过构建一个简单的Rust应用来深入理解这门语言。 我们的项目是一个命令行文本文件分析器,它不仅能读取和显示文件内容,还会提供一些基础的文本分析,如计算…

IDEA-git commit log 线

一、本地代码颜色标识 红色:新建的文件,没有add到git本地仓库蓝色:修改的文件,没有提交到git远程仓库绿色:已添加到git本地仓库,没有提交到git远程仓库灰色:删除的文件,没有提交到g…