Redis事务
2016-12-01 14:32
190 查看
Redis事务
MULTI EXEC
Redis中的事务(transaction)是一组命令的集合。事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次执行这些命令。multi就是生成事务,然后输入redis命令,最后用exec执行命令。redis>MULTI OK redis>SADD "user:1:following" 2 QUEUED redis>SADD "user:2:followers" 1 QUEUED redis>EXEC 1) (integer) 1 2) (integer) 1
错误处理
如果一个事务中的某个命令执行出错,Redis会怎样处理呢?(1)语法错误。语法错误指命令不存在或者命令参数的个数不对。
语法错误时,事务不会被执行,其中的正确指令也不会被执行。(2.6.5版本前会执行正确指令)
比如:
redis>MULTI OK redis>SET key value QUEUED redis>SET key (error)ERR wrong number of arguments for 'set' command redis> ERRORCOMMAND key (error) ERR unknown command 'ERRORCOMMAND' redis> EXEC (error) EXECABORT Transaction discarded because of previous errors.
(2)运行错误。运行错误指在命令执行时出现的错误,比如使用散列类型的命令操作集合类型的键,这种错误在实际执行之前Redis是无法发现的,所以在事务里这样的命令是会被Redis接受并执行的。
运行错误时,正确的指令会被执行。
redis>MULTI OK redis>SET key 1 QUEUED redis>SADD key 2 QUEUED redis>SET key 3 QUEUED redis>EXEC 1) OK 2) (error) ERR Operation against a key holding the wrong kind of value 3) OK redis>GET key "3"
Redis不支持回滚功能,使得Redis在事务上可以保持简洁和快速。redis的理念是这两种错误不应该出现,因此没必要为这种问题浪费性能。
WATCH
用了multi和exec指令后,可以保证一组指令一起执行,但是如何保证其他client在事务执行过程中不修改这些值呢?redis提供了WATCH指令,监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。监控一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,所以在MULTI命令后可以修改WATCH监控的键值),如:
redis>SET key 1 OK redis>WATCH key OK redis>SET key 2 OK redis>MULTI OK redis>SET key 3 QUEUED redis>EXEC (nil) redis>GET key "2"
疑问:有没有这样的功能,当我要执行事务时,相关的key被锁定,不允许其他client读写,直到事务完成或失败才释放锁?