redis命令详解与使用场景举例——Transaction(事务)

本文深入探讨Redis中的事务机制,包括MULTI、EXEC、DISCARD、WATCH等命令的使用方法及其实现原理。通过实例展示了如何利用这些命令进行数据操作,并解释了在不同情况下事务可能被打断的原因。

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

DISCARD

取消事务,放弃执行事务块内的所有命令。
如果正在使用 WATCH 命令监视某个(或某些) key,那么取消所有监视,等同于执行命令 UNWATCH 。
可用版本:
2.0.0+
时间复杂度:
O(1)。
返回值:
总是返回 OK 。

redis> MULTI
OK
redis> PING
QUEUED
redis> SET greeting "hello"
QUEUED
redis> DISCARD
OK

EXEC

执行所有事务块内的命令。
假如某个(或某些) key 正处于 WATCH 命令的监视之下,且事务块中有和这个(或这些) key 相关的命令,那么 EXEC 命令只在这个(或这些) key 没有被其他命令所改动的情况下执行并生效,否则该事务被打断(abort)。
可用版本:
1.2.0+
时间复杂度:
事务块内所有命令的时间复杂度的总和。
返回值:
事务块内所有命令的返回值,按命令执行的先后顺序排列。
当操作被打断时,返回空值 nil 。
事务被成功执行

redis> MULTI
OK
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> PING
QUEUED
redis> EXEC
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG

监视 key ,且事务成功执行

redis> WATCH lock lock_times
OK
redis> MULTI
OK
redis> SET lock "huangz"
QUEUED
redis> INCR lock_times
QUEUED
redis> EXEC
1) OK
2) (integer) 1

监视 key ,且事务被打断

redis> WATCH lock lock_times
OK
redis> MULTI
OK
redis> SET lock "joe"        # 就在这时,另一个客户端修改了 lock_times 的值,concurrentModifyed
QUEUED
redis> INCR lock_times
QUEUED
redis> EXEC                  # 因为 lock_times 被修改, joe 的事务执行失败
(nil)

MULTI

标记一个事务块的开始。
事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。
可用版本:
1.2.0+
时间复杂度:
O(1)。
返回值:
总是返回 OK 。

redis> MULTI            # 标记事务开始
OK
redis> INCR user_id     # 多条命令按顺序入队
QUEUED
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> PING
QUEUED
redis> EXEC             # 执行
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG

UNWATCH

取消 WATCH 命令对所有 key 的监视。
如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了。
因为 EXEC 命令会执行事务,因此 WATCH 命令的效果已经产生了;而 DISCARD 命令在取消事务的同时也会取消所有对 key 的监视,因此这两个命令执行之后,就没有必要执行 UNWATCH 了。
可用版本:
2.2.0+
时间复杂度:
O(1)
返回值:
总是 OK 。

redis> WATCH lock lock_times
OK
redis> UNWATCH
OK

WATCH key [key …]

监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
可用版本:
2.2.0+
时间复杂度:
O(1)。
返回值:
总是返回 OK 。
redis> WATCH lock lock_times
OK

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值