Redis 事务
概述
Redis 支持分布式环境下的事务操作,其事务可以一次执行多个命令,事务中的所有命令都会序列化地顺序执行。事务在执行过程中不会被其他客户端发送来的命令请求打断,服务器在执行完事务中的所有命令之后,才会继续处理其他客户端的其他命令。Redis 的事务操作分为开启事务、命令入队列、执行事务三个阶段
Redis 的事务执行流程如下:
- 开启事务:客户端执行 Multi 命令开启事务
- 提交请求:客户端提交命令到事务
- 任务入队列:Redis 将客户端的请求放入事务队列中等待执行
- 反馈入队状态:服务器返回 QUEUD,表示命令已被放入事务队列
- 执行命令:客户端通过 Exec 执行事务
- 事务执行错误:在 Redis 事务中如果某条命令执行错误,则其他命令会继续执行,不会回滚,可以通过 Watch 监控事务执行的状态并处理命令执行错误的异常情况
- 反馈执行结果:服务器向客户端返回事务执行的结果
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();
}
}