Redis的事务从开始到执行会经历以下三个阶段:
- 开始事务
- 命令入队
- 执行事务
1.使用MULTI 开始一个事务
2.批量操作在发送 EXEC 命令前被放入队列缓存。
3.收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
Redis事务常用命令:
命令 | 用例和描述 |
---|---|
MULTI | 标记一个事务块的开始 |
EXEC | 执行所有事务块内的命令 |
DISCARD | 取消事务,放弃执行事务块内的所有命令 |
WATCH key [key ...] | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断 |
UNWATCH | 取消 WATCH 命令对所有 key 的监视 |
实例:
#使用multi标记一个事务的开始
127.0.0.1:6379> multi
OK
#设置一个key-value
127.0.0.1:6379> set key1 SUNDAY
QUEUED
127.0.0.1:6379> set key2 XI~AN
QUEUED
127.0.0.1:6379> set key3 PLAY
QUEUED
#执行当前事务
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
#查看刚才插入的键值
127.0.0.1:6379> get key1
"SUNDAY"
127.0.0.1:6379> get key2
"XI~AN"
127.0.0.1:6379> get key3
"PLAY"
127.0.0.1:6379>
同时咱们也可以使用Redis的可视化工具Redis Desktop Manager工具查看刚才插入redis中的数据:
下一节将介绍Redis Desktop Manager 的安装及使用
DISCARD命令的使用
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a 1
QUEUED
127.0.0.1:6379> set b 2
QUEUED
127.0.0.1:6379> set c 3
QUEUED
# 取消事务,放弃执行事务块内的所有命令
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379>
WATCH 和UNWATCH
这两个命令使用在开启事务之前,watch可以监视key的动态,当被监视的key被其他命令改动,那么当前的事务将会终止,unwatch取消监听对象。
# 监听上述key1的值
127.0.0.1:6379> watch key1
OK
# 查看当前key1的值
127.0.0.1:6379> get key1
"wednesday"
# 修改key1的值为a
127.0.0.1:6379> set key1 a
OK
# 开始事务
127.0.0.1:6379> multi
OK
# 在事务中修改key1的值为2
127.0.0.1:6379> set key1 2
QUEUED
#执行事务,发现执行失败
127.0.0.1:6379> exec
(nil)
# 获取key1的值,发现还是在开启事务之前的a
127.0.0.1:6379> get key1
"a"
127.0.0.1:6379>
WATCH命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。监控一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,所以在EXEC命令后可以修改WATCH监控的键值),同时使用UNWATCH可以取消监控,这里就不再赘述了。
Redis保证一个事务中的所有命令要么都执行,要么都不执行。如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行。而一旦客户端发送了EXEC命令,所有的命令就都会被执行,即使此后客户端断线也没关系,因为Redis中已经记录了所有要执行的命令。除此之外,Redis的事务还能保证一个事务内的命令依次执行而不被其他命令插入。试想客户端A需要执行几条命令,同时客户端B发送了一条命令,如果不使用事务,则客户端B的命令可能会插入到客户端A的几条命令中执行。如果不希望发生这种情况,也可以使用事务。
不怕从零开始,只怕从未启程!
参考文献:
菜鸟教程:https://www.runoob.com/redis/redis-keys.html
《Redis实战》Josiah L. Carlson著