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读写,直到事务完成或失败才释放锁?
Redis事务由MULTI和EXEC命令组成,确保命令集合按顺序执行。如果命令存在语法错误,事务将不执行,而运行时错误则可能导致部分正确命令执行。Redis不支持事务回滚以保持高效。WATCH指令用于监视key,若在事务执行前被修改,事务将被取消。目前Redis未提供在事务执行期间锁定key以阻止其他客户端读写的机制。
1110

被折叠的 条评论
为什么被折叠?



