Redis 事务

概述

Redis 支持分布式环境下的事务操作,其事务可以一次执行多个命令,事务中的所有命令都会序列化地顺序执行。事务在执行过程中不会被其他客户端发送来的命令请求打断,服务器在执行完事务中的所有命令之后,才会继续处理其他客户端的其他命令。Redis 的事务操作分为开启事务、命令入队列、执行事务三个阶段

Redis 的事务执行流程如下:

  1. 开启事务:客户端执行 Multi 命令开启事务
  2. 提交请求:客户端提交命令到事务
  3. 任务入队列:Redis 将客户端的请求放入事务队列中等待执行
  4. 反馈入队状态:服务器返回 QUEUD,表示命令已被放入事务队列
  5. 执行命令:客户端通过 Exec 执行事务
  6. 事务执行错误:在 Redis 事务中如果某条命令执行错误,则其他命令会继续执行,不会回滚,可以通过 Watch 监控事务执行的状态并处理命令执行错误的异常情况
  7. 反馈执行结果:服务器向客户端返回事务执行的结果

Redis 事务相关命令有:

  • Multi:标记一个事务块的开始
  • Exec:执行所有事务块内的命令
  • Discard:取消事务,放弃执行事务块内的所有命令
  • Watch:监视一个(或多个)Key,如果在事务执行之前这个(或这些)Key 被其他命令改动,那么事务将被打断
  • Unwatch:取消 Watch 命令对所有 Key 的监视

代码实现

public void transactionSet(Map<String, Object> commandList) {
  // 1:开启事务权限
  redisTemplate.setEnableTransactionSupport(true);
  try {
    // 2:开启事务
    redisTemplate.multi():
    // 3:执行事务命令
    for (Map.Entry<String, Object> entry : commandList.entrySet()) {
      String mapkey = entry.getKey();
      Object mapValue = entry.getValue();
      redisTemplate.opsForValue().set(mapKey, mapValue);
    }
    // 4:执行成功,提交事务
    redisTemplate.exec();
  } catch (Exception e) {
    // 5:执行失败,回滚事务
    redisTemplate.discard();
  }
}