Redis的事务控制命令、常见执行情况及watch机制

本文深入解析Redis事务(transaction)概念,包括事务的开启、命令执行、取消及Watch机制。阐述了Redis事务如何确保命令序列的完整执行,以及在遇到错误时的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念:

事务是指一系列操作步骤中 这一系列的操作步骤要么完全执行 要么完全不执行
例如:微博的A用户关注了B用户 那么A的关注人列表中就会出现B用户 B用户的粉丝列表中就会有A用户

这个关注和被关注的过程是由一系列的操作步骤组成的:
1、A用户添加到B用户的粉丝列表中
2、B用户添加到A用户多关注列表中
这两个步骤必须全部执行成功 整个逻辑才是正确的 否则会产生数据的错误 例如:A用户的关注列表中有B用户 但B用户的粉丝列表中没有A用户

为了确保一系列的操作完全成功 提出了事务控制的概念

Redis的事务(transaction)是一组命令的集合 且至少是两个或两个以上的命令
Redis的事务确保了这些命令在被执行的时候不会被任何其它操作打断
单个 Redis 命令的执行是原子性的 但 Redis 没有在事务上增加任何维持原子性的机制 因此Redis事务的执行并不是原子性的

事务可以理解为一个打包的批量执行脚本 但批量指令并非原子化的操作 中间某条指令的失败不会导致前面已做指令的回滚 也不会造成后续的指令的停止

二、命令

标记一个事务块的开始 ------> 即 开启事务(beginTransaction)
事务内的多条命令会按照先后顺序被放入一个队列中
返回值:OK

multi

执行所有事务块内的命令 ------> 即 提交(commit)
返回值:事务内的所有执行语句的内容
事务被打断则返回null

exec

取消事务 ------> 即 回滚(rollback)
放弃执行事务块内的所有命令
返回值:OK

discard

监视一个或多个key
若在事务执行之前这个或这些key被其他命令所改动 那么事务将被打断
返回值:OK

watch key [key ...] 

取消watch命令对所有key的监视
若watch之后exec命令或discard命令被执行了 则无须再执行unwatch命令了
因为此时事务内的命令已被执行了 unwatch没有意义了
返回值:OK

unwatch

三、执行情况

情况1、正常执行步骤

首先开启事务 然后向事务队列中加入命令 最后执行事务提交

  • 1)multi: 用 multi 命令告诉Redis接下来要执行的命令先不要执行 而是暂时存起来(开启事务)
  • 2)sadd classmate Piconjo:第一条命令进入等待队列(命令入队)
  • 3)sadd classmate Tankman:第二条命令进入等待队列(命令入队)
  • 4)exce:告知redis执行前面储存的命令

在这里插入图片描述

情况2、事务执行exec之前 入队命令错误 放弃事务

  • 1)multi:正常命令
  • 2)set:正常命令
  • 3)incr:命令语法错误
  • 4)exec:无法执行事务 第一条正确的命令也不会执行

在这里插入图片描述

情况3、事务执行exec命令后 执行队列中的命令时发生命令执行错误 事务提交

  • 1)multi:正常命令
  • 2)set:正常命令
  • 3)lpop classmate:语法没有错误 执行时才会有错误
  • 4)exec:正常执行 发现错误则不执行该事务 其余事务还是会执行

在这里插入图片描述
在exec执行后的所产生的错误 即使事务中有某个或某些命令在执行时产生了错误
事务中的其他命令仍然会继续执行
Redis在事务失败时不进行回滚 而是继续执行余下的命令

Redis命令只会因错误的语法而失败(这些问题不能在入队时发现) 或是命令用在了错误类型的键上面
由于失败的命令并不是Redis导致 而是由编程错误造成的 况且这样的错误应该在开发的过程中被发现
生产环境中不应出现语法的错误 就是在程序的运行环境中也不应该出现语法的错误
Redis能够保证正确的命令一定会被执行
不需要对回滚进行支持 也是为了保证Redis的内部保持简单且快速

4、放弃事务 事务不执行

  • 1)multi:正常命令
  • 2)sadd classmate Piconjo:第一条命令进入等待队列(命令入队)
  • 3)sadd classmate Tankman:第二条命令进入等待队列(命令入队)
  • 4)discard:放弃事务 则命令队列不会被执行

在这里插入图片描述


四、Watch机制

原理:

使用watch监视一个或多个key 跟踪key的value修改情况 若如果有key的value值在事务exec执行之前被修改了 则当前整个事务被取消
exec会返回提示信息 表示事务已失败

Watch机制使得事务exec变得有条件 事务只有在被Watch的key没有修改的前提下才可执行
若不满足条件 事务就取消
若使用Watch监视了一个带过期时间的键 那么即使这个键过期了 事务仍然可以正常执行

测试:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

取消Watch对key的监视

  • 1、当调用exec为止 不管事务是否成功执行 对所有键的监视都会被取消
  • 2、当客户端断开连接时 该客户端对键的监视也会被取消
  • 3、使用unwatch命令手动取消对所有键的监视

为了在Windows安装ADB工具,你可以按照以下步骤进行操作: 1. 首先,下载ADB工具包并解压缩到你自定义的安装目录。你可以选择将其解压缩到任何你喜欢的位置。 2. 打开运行窗口,可以通过按下Win+R键来快速打开。在运行窗口中输入"sysdm.cpl"并按下回车键。 3. 在系统属性窗口中,选择"高级"选项卡,然后点击"环境变量"按钮。 4. 在环境变量窗口中,选择"系统变量"部分,并找到名为"Path"的变量。点击"编辑"按钮。 5. 在编辑环境变量窗口中,点击"新建"按钮,并将ADB工具的安装路径添加到新建的路径中。确保路径正确无误后,点击"确定"按钮。 6. 返回到桌面,打开命令提示符窗口。你可以通过按下Win+R键,然后输入"cmd"并按下回车键来快速打开命令提示符窗口。 7. 在命令提示符窗口中,输入"adb version"命令来验证ADB工具是否成功安装。如果显示版本信息,则表示安装成功。 这样,你就成功在Windows安装ADB工具。你可以使用ADB工具来执行各种操作,如枚举设备、进入/退出ADB终端、文件传输、运行命令、查看系统日志等。具体的操作方法可以参考ADB工具的官方文档或其他相关教程。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [windows环境安装adb驱动](https://blog.youkuaiyun.com/zx54633089/article/details/128533343)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Windows安装使用ADB简单易懂教程](https://blog.youkuaiyun.com/m0_37777700/article/details/129836351)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值