一、Redis 事务的概念
- Redis 事务的本质是 MULTI、EXEC、WATCH 等一系列命令的集合;
- 事务支持一次执行多个命令,一个事务中所有命令都会被序列化;
- 在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
总结说: Redis 事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。
二、Redis 事务的三个阶段
- 1、事务开始 MULTI
- 2、命令入队
- 3、事务执行 EXEC
事务执行过程中,如果服务端收到有 EXEC、DISCARD、WATCH、MULTI 之外的请求,将会把请求放入队列中排队。
三、Redis 事务相关命令
Redis 事务功能是通过 MULTI、EXEC、DISCARD、WATCH
四个命令实现的:
WATCH
:WATCH 命令是一个乐观锁,可以为 Redis 事务提供 check-and-set(CAS)行为。 可以监控一个或多个 key,一旦其中有一个 key 被修改(或删除),之后的事务就不会执行,监控一直持续到 EXEC 命令(UNWATCH
命令可以取消 watch 对所有 key 的监控);MULTI
:MULTI 命令用于开启一个事务,它总是返回 OK。 MULTI 执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是被放到一个队列中,当 EXEC 命令被调用时,所有队列中的命令才会被执行;EXEC
:执行所有事务块内的命令。返回事务块内所有命令的返回值,按命令执行的先后顺序排列。 当操作被打断时,返回空值 nil;DISCARD
:通过调用 DISCARD,客户端可以清空事务队列,并放弃执行事务, 并且客户端会从事务状态中退出;
注意: Redis 会将一个事务中的所有命令序列化,然后按顺序执行:
- Redis 不支持回滚: Redis 在事务失败时不进行回滚,而是继续执行余下的命令, 所以 Redis 的内部可以保持简单且快速。
- 如果在一个事务中的命令出现错误,那么所有的命令都不会执行;
- 如果在一个事务中出现运行错误,那么正确的命令会被执行。
四、Redis事务其他实现
- 1、基于
Lua
脚本,Redis 可以保证脚本内的命令一次性、按顺序地执行,其同时也不提供事务运行错误的回滚,执行过程中如果部分命令运行错误,剩下的命令还是会继续运行完; - 2、基于中间标记变量,通过另外的标记变量来标识事务是否执行完成,读取数据时先读取该标记变量判断是否事务执行完成。但这样会需要额外写代码实现,比较繁琐;