Redis事务

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

Redis事务

MULTI EXEC

Redis中的事务(transaction)是一组命令的集合。事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次执行这些命令。multi就是生成事务,然后输入redis命令,最后用exec执行命令。

redisMULTI
OK
redisSADD "user:1:following" 2
QUEUED
redisSADD "user:2:followers" 1
QUEUED
redisEXEC
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读写,直到事务完成或失败才释放锁?

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值