Redis事务
1、简介
redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
- 批量操作在发送 exec 命令前被放入队列缓存。
- 收到 exec 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务。
- 命令入队。
- 执行事务。
1、redis会将一个事务中的所有命令序列化,然后按顺序执行
2、执行中不会被其他命令插入,不允许出现加塞行为
2、命令
下表列出了 redis 事务的相关命令:
序号 |
命令及描述 |
1 |
discard |
2 |
exec |
3 |
multi |
4 |
unwatch |
5 |
watch key [key ...] |
3、示例
3.1. 示例1:multi exec
功能需求:a向b账号转账50元,原始a账号余额是80元,b账户余额是10元。
一个事务的例子,它先以multi开始一个事务,然后将多个命令入队到事务中,最后由exec命令触发事务。
3.2. 示例2:discard放弃队列执行
通过discard命令进行rollback的操作,就是回滚事务。
3.3. 示例3:事务的错误处理
事务的错误处理:
如果某个命令爆出来错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。
我们发现,incy hello 命令会出错,因为他将字符串-1操作。
但是这个命令也是在事务里面(事务队列里面),虽然他执行失败了,但是没影响别的命令的执行。
3.4. 示例4:事务的错误处理
事务的错误处理:
队列中的某个命令出现了报告错误,执行时整个的所有队列都会被取消。
由于之前的错误,导致事务回滚。
即运行时异常和编译错误时。
3.5. 示例5:事务的watch
watch key [key ...]
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断,回滚。
需求:某一账户在一事务中进行操作,在提交事务前,另一个进程对该账户进行操作。
(客户端1进行账户减10的操作,在事务中,注意是在watch监视中)
(客户端2在客户端1未执行事务的时候,就减去了账户的100元)
(客户端1此时执行exec,发现事务没有执行成功,回滚了。。)
3.6. 示例5:事务的unwatch
unwatch
取消 watch 命令对所有 key 的监视。
这个命令用的少,因为在执行watch命令后,执行exec和discard命令后会自动执行unwatch,不需要自己主动执行unwatch
4、应用场景
一组命令必须同时都执行,或者都不执行。
我们想保证一组命令在执行过程之中不被其他命令插入。
商品秒杀(活动)。