Redis事物
redis中的事物(transaction)是一组命令的集合。事物同命令都是redis的最小执行单位。一个事物中的命令要么都被执行要么都不被执行。事物的应用最常见的例子就是转账,A出账,B入账,要么全执行,要么都不被执行。
事物的原理是先将属于一个事物的命令发送给redis,然后再让redis依次执行这些命令。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SADD setA -1 0
QUEUED
127.0.0.1:6379> SADD setB 5 6
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 2
2) (integer) 2
127.0.0.1:6379> SMEMBERS setA
1) "-1"
2) "0"
3) "1"
4) "2"
5) "3"
127.0.0.1:6379> SMEMBERS setB
1) "2"
2) "3"
3) "4"
4) "5"
5) "6"
首先,使用MULTI命令告诉redis,接下来的数条命令属于同一个事物。redis会将这几条命令暂时缓存起来,并返回OK。接下来输入命令,redis会返回QUEUE表示已将命令放到缓存队列中。当把所有要执行的命令发送给redis之后,使用EXEC命令告诉Redis将等待执行的事物队列中的全部命令按照顺序执行。
Redis保证了一个事务中要么都执行,要么都不执行。如果在发送EXEC命令之前客户端断线了,那么Redis会清空事物队列,事务中所有的命令都不会执行。Redis事物还能保证一个事务内命令依次执行而不被其他的命令插入。
错误处理
语法错误
语法错误指命令错误或者命令不存在。
只要有一个命令有语法错误,执行EXEC命令后Redis就会直接返回错误,连正确的命令也不会被执行。
运行错误
运行错误指在命令执行时出现的错误,比如使用散列类型的命令操作集合类型的key。这种错误在实际执行之前redis是不会发现的,所以在事物里这样的命令是会被redis接受并执行的。
如果事务里有一条命令出现了错误,事务里其他的命令依然会被执行(包括出错命令之后的命令)。
++redis的事务并没有关系数据库提供的rollback功能,为此务必避免运行错误。++
WATCH 命令介绍
WATCH命令可以监控一个或者多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。
127.0.0.1:6379> watch key
OK
127.0.0.1:6379> set key 2
OK
127.0.0.1:6379> set hi 3
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set hi 2 //不会被执行
QUEUED
127.0.0.1:6379> set key 3 //不会被执行
QUEUED
127.0.0.1:6379> set hi 4 // 不会被执行
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get key
"2"
127.0.0.1:6379> get hi
"3"