0%

redis事务

redis事务

注意:我使用的版本是6.0.10,不同版本可能略有差别

redis可以一次执行多条命令,一个事务中所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入

事务的常用命令

  • multi 标记一个事务块的开始
  • exec 执行事务块的命令
  • discard 取消事务,丢弃事务块的命令
  • watch key [key …] 监视key,如果在事务执行之前,这个key被其他命令所改动,则事务中断
  • unwatch 取消监视所有key

事务的执行

1
2
3
4
5
6
7
8
9
10
11
12
13
#标注事务的开始
MULTI
OK
#在事务内部的操作全是入队,不会真正执行
set tran1 v1
QUEUED
set tran2 v2
QUEUED
#执行
exec
1) OK
2) OK

redis的事务没有隔离级别的概念,并且不会保证原子性

watch监视

watch指令类似于乐观锁,在事务开始之前使用,如果在watch之后有任何所监视的key发生变化,exec指令所执行的事务将会被放弃

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#设值
set balance 100
OK
#监视
watch balance
OK
#修改
set balance 200
OK
get balance
"200"
#开启事务
MULTI
OK
#修改入队
DECRBY balance 10
QUEUED
#执行失败
exec
(nil)
get balance
"200"

redis只能保证事务中的操作顺序执行,但是如果事务中有一条命令失败了,并不会回滚其他命令