Redis事务的使用

一、理论基础

1、redis事务概念

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

2、redis事务执行命令的性质

redis事务在执行一个队列中的一系列命令时遵循一次性、顺序性、排他性的性质。

3、redis事务的执行阶段

(1) 开始事务(multi)。
(2) 命令入队。
(3) 执行事务(exec)。

4、redis事务的原子性问题

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

二、redis事务命令

redis事务命令说明
命令 说明
multi 标记一个事务块的开始。
exec 触发事务, 一并执行事务中的所有命令。
discard 取消事务,放弃执行事务块内的所有命令。
watch key [key...] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
unwatch 取消 WATCH 命令对所有 key 的监视。

三、操作

1、正常执行

192.168.230.21:6379> multi
OK
192.168.230.21:6379> set aa AA
QUEUED
192.168.230.21:6379> set bb BB
QUEUED
192.168.230.21:6379> set cc CC
QUEUED
192.168.230.21:6379> set dd DD
QUEUED
192.168.230.21:6379> exec
1) OK
2) OK
3) OK
4) OK
192.168.230.21:6379> get aa
"AA"

2、取消事务

192.168.230.21:6379> multi
OK
192.168.230.21:6379> set aa 11
QUEUED
192.168.230.21:6379> set ee EE
QUEUED
192.168.230.21:6379> discard
OK
192.168.230.21:6379> get aa
"AA"
192.168.230.21:6379> get ee
(nil)
192.168.230.21:6379>

3、事务队列中存在命令错误

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

192.168.230.21:6379> multi
OK
192.168.230.21:6379> set aa 22
QUEUED
192.168.230.21:6379> set bb 33
QUEUED
192.168.230.21:6379> setq cc 44
(error) ERR unknown command 'setq'
192.168.230.21:6379> set ff FF
QUEUED
192.168.230.21:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
192.168.230.21:6379> get ff
(nil)
192.168.230.21:6379> get bb
"BB"
192.168.230.21:6379>

4、事务队列中存在语法错误

如果在事务队列中存在语法性错误(类似于java的1/0的运行时异常),则执行EXEC命令时,其他正确命令会被执行,错误命令抛出异常。

192.168.230.21:6379> multi
OK
192.168.230.21:6379> incr aa
QUEUED
192.168.230.21:6379> set ff FF
QUEUED
192.168.230.21:6379> set bb 22
QUEUED
192.168.230.21:6379> exec
1) (error) ERR value is not an integer or out of range
2) OK
3) OK
192.168.230.21:6379> get bb
"22"
192.168.230.21:6379> get ff
"FF"
192.168.230.21:6379> 

错误原因:字符串不能累加1

5、watch监控

watch 命令可以监控一个或多个键,一旦有其中一个键被修改(被删除),后面的事务就不会执行了。监控一直持续到 EXEC 命令(事务中的命令是在exec之后才执行的,所以在multi命令后可以修改watch监控的键值)
假设我们通过watch命令在事务执行之前监控了多个Keys,倘若在watch之后有任何Key的值发生了变化,exec命令执行的事务都将被放弃,同时返回Null multi-bulk应答以通知调用者事务执行失败。

(1)、执行watch,不执行multi、exec

192.168.230.21:6379> get aa
"AA"
192.168.230.21:6379> watch aa
OK
192.168.230.21:6379> set aa 11
OK
192.168.230.21:6379> get aa
"11"
192.168.230.21:6379>

(2)、执行 watch 命令,通知执行 MULTI、exec

192.168.230.21:6379> set aa Aa
OK
192.168.230.21:6379> get aa
"Aa"
192.168.230.21:6379> multi
OK
192.168.230.21:6379> set aa 11
QUEUED
192.168.230.21:6379> exec
(nil)
192.168.230.21:6379> get aa
"Aa"
192.168.230.21:6379>

(3)、exec 执行之后,会自动执行 UNWatch 命令,撤销监听操作

192.168.230.21:6379> set aa Aa
OK
192.168.230.21:6379> get aa
"Aa"
192.168.230.21:6379> multi
OK
192.168.230.21:6379> set aa 11
QUEUED
192.168.230.21:6379> exec
(nil)
192.168.230.21:6379> get aa
"Aa"
192.168.230.21:6379> set aa 11
OK
192.168.230.21:6379> get aa
"11"
192.168.230.21:6379> 

(4)、unwatch撤销监听

192.168.230.21:6379> get bb
"BBB"
192.168.230.21:6379> watch bb
OK
192.168.230.21:6379> multi
OK
192.168.230.21:6379> unwatch
QUEUED
192.168.230.21:6379> set bb 222
QUEUED
192.168.230.21:6379> exec
1) OK
2) OK
192.168.230.21:6379> get bb
"222"
192.168.230.21:6379> 
发布了143 篇原创文章 · 获赞 12 · 访问量 8644

猜你喜欢

转载自blog.csdn.net/hyj_king/article/details/105063775