一、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、基于中间标记变量,通过另外的标记变量来标识事务是否执行完成,读取数据时先读取该标记变量判断是否事务执行完成。但这样会需要额外写代码实现,比较繁琐;