1.Redis事务简介
Redis事务可以通过MULTI、EXEC、WATCH和DISCARD指令来实现。
1. MULTI指令:表示事务的开始,之后的所有指令都会被逐一记录,但不会立即执行。
2. EXEC指令:表示事务的执行,会按照记录的指令逐一执行。
3. WATCH指令:可以监视一个或多个键的变化,如果在事务执行期间被其他客户端修改,事务会被回滚。
4. DISCARD指令:表示事务的撤销,可以放弃之前记录的指令
2.RedisTemplate 实现 redis 事务
String key1 = "mykey1";String key2 = "mykey2";
String value1 = "hello";
String value2 = "world";
redisTemplate.execute(new SessionCallback<Object>() {
@Override
public Object execute(RedisOperations redisOperations) throws DataAccessException {
redisOperations.multi(); // 开始事务
redisOperations.opsForValue().set(key1, value1);
redisOperations.opsForValue().set(key2, value2); // 数据会被覆盖
redisOperations.exec(); // 提交事务
return null;
}
});
在这个例子中,我们先定义了一个 key 和两个不同的 value。然后通过 execute 方法执行一个 SessionCallback 回调方法,其中包含了 Redis 事务的所有步骤。在回调方法中,我们先调用了 multi 方法,开始事务,然后执行了两个 set 命令。最后,我们通过 exec 方法提交事务,这个过程中如果出现了错误,所有命令都会被回滚,数据不会被修改。
需要注意的是,在使用 Redis 事务时,需要确保多条命令都是原子的,在执行过程中不会被其他任务中断或修改,否则可能会导致事务失败。此外,Redis 的事务并不是分布式事务,仅仅是对同一个 Redis 一个实例中的多条命令进行操作的一种方式。
3.Redis 的事务并不是分布式事务
是的,Redis 的事务并不是分布式事务。虽然 Redis 支持多命令事务,但是在 Redis 集群中,每个节点只能进行本地事务,没有全局视图,因此无法支持分布式事务。如果需要进行分布式事务,需要使用支持分布式事务的数据库,例如 MySQL Cluster、TiDB 等或者使用lua脚本