数据库
首页 > 数据库> > Redis基础之事务

Redis基础之事务

作者:互联网

如果Redis需要执行一组命令,为了保持数据的一致性,连续性,需要用到事务(Transaction),本文以一些简单的小例子,简述Redis事务相关内容,仅供学习分享使用,如有不足之处,还请指正。

Redis事务涉及命令

 

事务基本操作

基本事务以MULTI开始,以EXEC结束,中间是一组Redis命令,如下所示:

 1 127.0.0.1:6379> MULTI
 2 OK
 3 127.0.0.1:6379> SET NAME HSIANG
 4 QUEUED
 5 127.0.0.1:6379> SET AGE 20
 6 QUEUED
 7 127.0.0.1:6379> SET SEX MALE
 8 QUEUED
 9 127.0.0.1:6379> SET ADDR SHENZHEN
10 QUEUED
11 127.0.0.1:6379> EXEC
12 1) OK
13 2) OK
14 3) OK
15 4) OK
16 127.0.0.1:6379> 

 

取消事务

取消事务,则恢复数据到事务执行之前的状态,以MULTI开始,以DISCARD结尾,如下所示:

 1 127.0.0.1:6379> GET AGE
 2 "20"
 3 127.0.0.1:6379> MULTI
 4 OK
 5 127.0.0.1:6379> INCR AGE
 6 QUEUED
 7 127.0.0.1:6379> INCR AGE
 8 QUEUED
 9 127.0.0.1:6379> INCR AGE
10 QUEUED
11 127.0.0.1:6379> DISCARD
12 OK
13 127.0.0.1:6379> GET AGE
14 "20"

 

事务部分执行

Redis事务中,如果要执行的一组命令中,没有语法错误,但是有数据类型错误,在进行EXEC的时候,则其他命令执行成功,错误数据执行失败,即为部分成功。如下所示:

 1 127.0.0.1:6379> MULTI
 2 OK
 3 127.0.0.1:6379> INCR AGE
 4 QUEUED
 5 127.0.0.1:6379> INCR ADDR
 6 QUEUED
 7 127.0.0.1:6379> INCR AGE
 8 QUEUED
 9 127.0.0.1:6379> EXEC
10 1) (integer) 21
11 2) (error) ERR value is not an integer or out of range
12 3) (integer) 22
13 127.0.0.1:6379> GET AGE
14 "22"

 

事务终止

如果要执行的Redis命令,存在语法错误,则在进行EXEC的时候回滚,如下所示:

 1 127.0.0.1:6379> MULTI
 2 OK
 3 127.0.0.1:6379> INCR AGE
 4 QUEUED
 5 127.0.0.1:6379> SET ADDR
 6 (error) ERR wrong number of arguments for 'set' command
 7 127.0.0.1:6379> INCR AGE
 8 QUEUED
 9 127.0.0.1:6379> EXEC
10 (error) EXECABORT Transaction discarded because of previous errors.
11 127.0.0.1:6379> GET AGE
12 "22"

Redis锁

锁分为乐观锁,悲观锁,以下分别介绍:

WATCH监控

当监控的key的值在事务之前发生变化了,则事务不被执行。只有取消监控后,事务才会执行,如下所示:

 1 127.0.0.1:6379> WATCH balance
 2 OK
 3 127.0.0.1:6379> set balance 300
 4 OK
 5 127.0.0.1:6379> MULTI
 6 OK
 7 127.0.0.1:6379> INCRBY balance 10
 8 QUEUED
 9 127.0.0.1:6379> DECRBY debt 10
10 QUEUED
11 127.0.0.1:6379> EXEC
12 (nil)
13 127.0.0.1:6379> GET balance
14 "300"
15 127.0.0.1:6379> UNWATCH
16 OK

Redis事务的特性

  1. 单独的隔离操作:事务中的所有命令,都会被序列化,按顺序执行。事务在执行过程中,不会被其他的命令请求中断。
  2. 没有隔离级别的概念:队列中的命令,没有提交之前,都没有实际的被执行,也就不存在事务内查看事务内的更新。
  3. 不保证原子性:redis同一事务中,如果有某一条命令执行失败,则其他命令会被执行,不会回滚(与关系型数据库不同)。

备注

早发白帝城

作者:李白(唐代)

朝辞白帝彩云间,千里江陵一日还。

两岸猿声啼不住,轻舟已过万重山。

标签:事务,127.0,OK,0.1,Redis,基础,6379,QUEUED
来源: https://www.cnblogs.com/hsiang/p/14311126.html