Redis事务是一个组有多个Redis命令的集合,这些命令可以作为一个原子操作来执行。
Redis事务通常用于以下两种情况:
保证操作的原子性:在多个命令的执行过程中,如果有一个命令执行失败,整个事务都需要回滚(撤销)到事务开始前的状态,确保数据的一致性。
实现乐观锁:通过在事务中监视某些键,如果这些键在事务执行之前被其他客户端修改,则事务可以取消执行,从而避免了出现死锁或数据不一致的情况。
在Redis中,通过使用MULTI命令开始一个事务,然后将多个命令添加到事务中,最后使用EXEC命令来执行这些命令。如果事务中的任何一个命令执行失败,可以使用DISCARD命令来取消事务,或者使用UNWATCH命令来取消对键的监视。
Redis的与事务相关的命令说明:
这些命令通常用于保证在Redis事务中的操作的原子性和一致性。通过将多个命令放入同一个事务中,可以确保这些命令作为一个整体一起执行,并且在有其他客户端对被监视的键进行修改时,能够适当地处理冲突和错误。
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
一个事务从开始到执行会经历以下三个阶段:
说明:
时间复杂度:
返回值:
以下是一个使用DISCARD命令的示例代码:
127.0.0.1:6379> multi # 开始一个事务
OK
127.0.0.1:6379> set key1 "value1" # 添加一个SET命令到事务中
QUEUED
127.0.0.1:6379> set key2 "value2" # 添加另一个SET命令到事务中
QUEUED
127.0.0.1:6379> discard # 取消事务,不执行SET命令
OK
说明:
时间复杂度:
返回值:
以下是一个使用EXEC命令的示例代码:
# 事务被成功执行
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR userid
QUEUED
127.0.0.1:6379> INCR userid
QUEUED
127.0.0.1:6379> INCR userid
QUEUED
redis> PING
QUEUED
redis> EXEC
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG
# 监视 key ,且事务成功执行
127.0.0.1:6379> WATCH lock lock_value
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET lock "xiaojian"
QUEUED
127.0.0.1:6379> INCR lock_value
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (integer) 1
# 监视 key ,且事务被打断
127.0.0.1:6379> WATCH lock lock_value # 监视lock键 和 lock_value键
OK
127.0.0.1:6379> MULTI # 开始一个事务
OK
127.0.0.1:6379> SET lock "mr" # 就在这时,另一个客户端修改了 lock 键的值,另一个客户端修改 这个被监视的 lock键,此时事务必定是失败的!
QUEUED
127.0.0.1:6379> SET lock_value # 此时就算 lock_value 没被修改,事务失败已成定局。
QUEUED
127.0.0.1:6379> EXEC # 因为 lock 被其他客户端修改,事务自动取消执行。
(nil)
说明:
时间复杂度:
返回值:
以下是一个使用MULTI命令的示例代码:
127.0.0.1:6379> multi # 标记事务开始
OK
127.0.0.1:6379> set key1 value1 # 多条命令按顺序入队
QUEUED
127.0.0.1:6379> set key2 valus2
QUEUED
127.0.0.1:6379> exec # 执行
1) OK
2) OK
说明:
时间复杂度:
返回值:
以下是一个使用UNWATCH命令的示例代码:
127.0.0.1:6379> WATCH lock lock_value
OK
127.0.0.1:6379> UNWATCH
OK
说明:
时间复杂度:
返回值:
以下是一个使用WATCH命令的示例代码:
127.0.0.1:6379> watch key1 # 监视一个键 (注意:可以一条命令监视多个键 如:WATCH key1 key2)
127.0.0.1:6379> watch key2 # 再监视一个键
127.0.0.1:6379> multi # 开始一个事务
127.0.0.1:6379> set("key1", "value1") # 在被监视的键上进行SET操作
127.0.0.1:6379> set("key2", "value2") # 在被另外