1. 概述
Redis通过 MULTI, EXEC / WATCH 等命令来实现事务.
事务提供一种将多个命令请求打包, 然后一次性、按顺序的执行多个命令的机制.
并且在事务执行期间, 服务器不会中断事务而改去执行其他客户端的命令请求, 他将事务中的所有命令执行完毕, 然后才去处理其他客户端的命令请求.
Redis的事务不支持 回滚
2. 事务
> multi OK > incr books QUEUED > incr books QUEUED > exec (integer) 1 (integer) 2
2.1 基本使用
- multi 命令表示事务的开始
- 之后的命令会被放入一个事务队列, 是一个 multiCmd 类型的数组, 它以先进先出的方式保存入队的命令.
- 当执行 exec 命令时, 服务器会遍历客户端的事务队列, 执行队列中保存的所有命令.
- 当执行 discard 命令时, 表示放弃执行这个事务, 事务队列中的所有命令都不会执行.
2.2 入队错误和执行错误
- 当事务因为命令入队发生错误时, 事务中的所有命令都不会执行;
- 当事务执行时发生错误, 错误的命令不会影响其它命令的执行;
2.3 优化
Redis 事务在发送每个指令到事务缓存队列时都要经过一次网络读写,当一个事务内部的指令较多时,需要的网络 IO 时间也会线性增长。
所以通常 Redis 的客户端在执行事务时都会结合 pipeline 一起使用,这样可以将多次 IO 操作压缩为单次 IO 操作.
3. watch
watch 命令是一个乐观锁, 它可以在 exec 前执行, 监视任意数量的数据库键, 并在 exec 执行时, 检查被监视的数据库键是否被修改, 如果至少有一个数据库键被修改过, 则服务器拒绝执行这个事务, 并返回一个代表事务执行失败的空回复( nil )