若是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的时候,则其余命令执行成功,错误数据执行失败,即为部分红功。以下所示:spa
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的时候回滚,以下所示:code
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"
锁分为乐观锁,悲观锁,如下分别介绍:blog
当监控的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
早发白帝城事务
做者:李白(唐代)ci
朝辞白帝彩云间,千里江陵一日还。io
两岸猿声啼不住,轻舟已过万重山。