Redis事务(4)

news2024/11/25 10:59:45

作者简介:码上言


代表教程:Spring Boot + vue-element 开发个人博客项目实战教程


专栏内容:个人博客系统


我的文档网站:http://xyhwh-nav.cn/

文章目录

  • Redis事务
    • 1、Redis事务概念
    • 2、应用
      • 1、MULTI开启事务
      • 2、事务失败处理
      • 3、Redis为什么不支持事务回滚?
      • 4、EXEC执行事务
      • 5、DISCARD取消事务
      • 6、WATCH监视key
      • 7、UNWATCH取消监视所有key

Redis事务

1、Redis事务概念

Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。

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

批量操作在发送 EXEC 命令前被放入队列缓存,并不会被实际执行!

Redis不保证原子性:

Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。

收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。

一个事务从开始到执行会经历以下三个阶段:

  • 开始事务。
  • 命令入队。
  • 执行事务。

Redis事务相关命令:

  • MULTI :开启事务,redis会将后续的命令逐个放入队列中,然后使用EXEC命令来原子化执行这个命令系列。
  • EXEC:执行事务中的所有操作命令。( 一旦执行exec后,之前加的监控锁都会被取消掉 )
  • DISCARD:取消事务,放弃执行事务块中的所有命令。
  • WATCH key1 key2 …:监视一个或多个key,如果事务在执行前,这个key(或多个key)被其他命令修改,则事务被中断,不会执行事务中的任何命令。
  • UNWATCH:取消WATCH对所有key的监视。

2、应用

1、MULTI开启事务

(1) 给k1、k2分别赋值,在事务中修改k1、k2,执行事务后,查看k1、k2值都被修改。

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 11
QUEUED
127.0.0.1:6379> set k2 22
QUEUED
127.0.0.1:6379> EXEC   // 或者选择取消事务DISCARD
1) OK
2) OK
127.0.0.1:6379> get k1
"11"
127.0.0.1:6379> get k2
"22"

2、事务失败处理

  • 若在事务队列中存在命令性错误(类似于java编译性错误),则执行EXEC命令时,所有命令都不会执行。

例如:在开启事务后,修改k1值为11,k2值为22,但k2语法错误,最终导致事务提交失败,k1、k2保留原值。

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 11
QUEUED
127.0.0.1:6379> setss k2 22
(error) ERR unknown command `setss`, with args beginning with: `k2`, `22`,
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379>
  • 若在事务队列中存在语法性错误(类似于java的1/0的运行时异常),则执行EXEC命令时,其他正确 命令会被执行,错误命令抛出异常。

例如:在开启事务后,修改k1值为11,k2值为22,但将k2的类型作为List,在运行时检测类型错误,最终导致事务提交失败,此时事务并没有回滚,而是跳过错误命令继续执行, 结果k1值改变、k2保留原值。

127.0.0.1:6379> set k1 v2
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 11
QUEUED
127.0.0.1:6379> lpush k2 22
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get k1
"11"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379>

3、Redis为什么不支持事务回滚?

多数事务失败是由语法错误或者数据结构类型错误导致的,语法错误说明在命令入队前就进行检测的,而类型错误是在执行时检测的,Redis为提升性能而采用这种简单的事务,这是不同于关系型数据库的,特别要注意区分。

4、EXEC执行事务

必须与MULTI命令成对使用

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
127.0.0.1:6379>

5、DISCARD取消事务

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379>

6、WATCH监视key

Redis的命令是原子性的,而事务是非原子性的,我们要让Redis事务完全具有事务回滚的能力,需要借助于命令WATCH来实现。

Redis使用WATCH命令来决定事务是继续执行还是回滚,那就需要在MULTI之前使用WATCH来监控某些键值对,然后使用MULTI命令来开启事务,执行对数据结构操作的各种命令,此时这些命令入队列。

当使用EXEC执行事务时,首先会比对WATCH所监控的键值对,如果没发生改变,它会执行事务队列中的命令,提交事务;如果发生变化,将不会执行事务中的任何命令,同时事务回滚。当然无论是否回滚,Redis都会取消执行事务前的WATCH命令。

111

事务,修改k1值为12,k2为22,执行EXEC,发回nil,说明事务回滚;查看下k1、k2的值都没有被事务中的命令所改变。

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> WATCH k1
OK
127.0.0.1:6379> set k1 11
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 22
QUEUED
127.0.0.1:6379> EXEC
(nil)
127.0.0.1:6379> get k1
"11"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379>

watch指令类似于乐观锁,在事务提交时,如果watch监控的多个KEY中任何KEY的值已经被其他客户端 更改,则使用EXEC执行事务时,事务队列将不会被执行,同时返回Nullmulti-bulk应答以通知调用者事 务执行失败。

7、UNWATCH取消监视所有key

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> WATCH k1
OK
127.0.0.1:6379> set k1 v11
OK
127.0.0.1:6379> UNWATCH
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 11
QUEUED
127.0.0.1:6379> set k2 22
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
127.0.0.1:6379> get k1
"11"
127.0.0.1:6379> get k2
"22"
127.0.0.1:6379>

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

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

相关文章

【数据库】数据库索引结构分析,MySQL单表最多能存放多少数据

经常听到MySQL单表最多能存放2千万数据,多了就要考虑分表,依据是什么呢? 本文以MySQL为例,默认数据页大小是16KB。 索引内容结构 非叶子节点 主键页号 假如: 主键是bigint,8bit;页号是4bit&…

Vue中v-html用法以及指令汇总

操作数组的方法 : push:数组最后位置新增元素 pop: 删除最后一个元素 shift: 删除第一个元素 unshift:往前面加一个元素 splice:在数组的指定位置插入、删除、替换一个元素 sort: 数组排序…

力扣算法数学类—Excel表列名称

目录 Excel表列名称 题解: 代码: Excel表列名称 168. Excel表列名称 - 力扣(LeetCode) 给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。 例如: A -> 1 B -> 2 C -> 3 ... Z -…

CENTOS安装 graylog5.0

我们直接开始 基础环境和java sudo yum install epel-release 并安装带有 sudo yum install pwgenyum install java-1.8.0-openjdk-headless.x86_64 MONGODB 安装数据库 6.0 [mongodb-org-6.0] nameMongoDB Repository baseurlhttps://repo.mongodb.org/yum/redhat/$relea…

ensp静态路由

要求: 1.全网可达 2.拓朴中所需地址全部基于192.168.0.0/24 3.静态路由(不许使用其他动态) 4.R2环回需要汇总 拓朴图: 将192.168.0.0/24划分为5个子网, 得: 192.168.0.0/27 192.168.0.32/27 192.168.0.64/…

在Windows Server2016上搭建Active Directory域控服务

搭建服务端 使用Windows2016数据中心版完成 1. 配置服务器角色 2. 选择服务器角色 3. 选择当前服务器4. 选择Active Directory和DNS角色5. 确认安装 6. 提升为Domain Controller域控服务器 7. 设置根域 8. 配置保护密码 9. DNS 10. NetBIOS配置 11. 指定数据文件位置 12. 确…

Flink AggregateFunction窗口函数,merge何时执行

1.前言 在我们使用Flink DataStream API编写业务代码时,aggregate()算子和AggregateFunction无疑是非常常用的。编写一个AggregateFunction需要实现4个方法: /** Licensed to the Apache Software Foundation (ASF) under one* or more contributor li…

瀚高企业版数据库V6单机安装指导手册(Linux)

目录 瀚高企业版数据库V6单机安装指导手册(Linux) 1. 环境准备 1.1 防火墙设置 1.1.1 开放数据库使用端口 1.1.2 关闭防火墙 1.2 检查时区和时间 1.3 创建highgo用户 1.4 检验安装包 2. 软件安装 2.1 图形化安装 3. 设置highgo用户环境变量 4.…

RocketMQ无损扩容实战

这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党 背景 假设目前我们的线上部署的RocketMQ部署的是一主一从,现在随着业务的发展,或者是我们需要做一些促销活动,会有突发流量高…

【unity细节】为什么发射炮弹实例化出来了却无法移动

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏:unity细节和bug ⭐为什么发射炮弹实例化出来了却无法移动⭐ 文章目录 ⭐为什么发射炮弹实例化出来…

JS高级进阶

JavaScript 进阶 - 第1节 学习作用域、变量提升、闭包等语言特征,加深对 JavaScript 的理解,掌握变量赋值、函数声明的简洁语法,降低代码的冗余度。 理解作用域对程序执行的影响能够分析程序执行的作用域范围理解闭包本质,利用闭包…

java mybatis

1.框架介绍 为什么使用框架? (1)框架效率高,成本低 (2)框架是别人写好的构建,我们只需学会如何使用它【可维护性高】 (3)框架是基于MVC的思想【web层独有的思想】的拓展而开发的…

DeepC 实用教程(四)分析

目 录 一、前言二、DeepC分析三、新建分析 / New Analysis四、Response Storage五、Static Analysis Options六、Dynamic Analysis Options七、Multiple Analysis八、提交分析/执行分析九、参考文献 一、前言 SESAM (Super Element Structure Analysis Module&#…

【动手学深度学习】GPU初步认识与使用

【动手学深度学习】GPU初步认识与使用 查看显卡 使用nvidia-smi命令来查看显卡信息 pytorch中每一个数组都有一个设备,将其称之为环境,那么默认情况下都是在CPU上,有时候环境是GPU 计算设备 默认情况下,张量是在内存中创建的&a…

Codeforces Round 885 (Div. 2) A题

原题div.2A 很容易看不懂样例4,就是我们以为此题只能走一分钟,但是事实上不是的,这个人可以走无限分钟,我们借助样例2来推演出来ps:可能不是正解,正解可以去看官方题解或者别的题解,但是也大差不差 #inclu…

应用在电磁炉中的常用IGBT管 IHW20N135R5 优势及其特性

应用在电磁炉中的常用IGBT管 IHW20N135R5深力科 在TO-247封装中具有单片集成反向导通二极管的反向导通R5 1350 V,20 A RC-H5 IGBT已针对感应烹饪应用的苛刻要求进行了优化。1350 V RC-H5 IGBT采用单片集成二极管,非常适合软开关应用,如感应烹…

时序预测 | MATLAB实现LSTM时间序列未来多步预测

基本介绍 实际工程中,未来预测是值得研究的课题之一,大部分深度模型在短期预测上表现不错,在中长 期预测上往往欠佳。 本文依然借助LSTM专栏的一些基础预测,探讨未来预测的简单实现方式。 程序设计 直接多步预测 直接多步预测的本…

【分布式应用】Ceph的实战应用

目录 一、创建 CephFS 文件系统 MDS 接口1.1服务端操作1)在管理节点创建 mds 服务2)查看各个节点的 mds 服务3)创建存储池,启用 ceph 文件系统4)查看mds状态,一个up,其余两个待命,目…

【深度学习】张量的广播专题

一、说明 张量广播(tensor broadcasting)是一种将低维张量自动转化为高维张量的技术,使得张量之间可以进行基于元素的运算(如加、减、乘等)。在进行张量广播时,会将维度数较少的张量沿着长度为1的轴进行复制…

数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)

目录 选择排序 思路图解 代码&#xff08;C语言&#xff09; 时间复杂度 堆排序 算法1 算法2 堆排序代码 选择排序 思路图解 代码&#xff08;C语言&#xff09; void Selection_Sort(ElementType A[], int N) {for(i 0; i < N; i){MinPosition ScanForMin(A,i,N…