我第一尝试的方案如下:
1
2
3
4
5
6
7
|
stringRedisTemplate.multi();
stringRedisTemplate.opsForValue().set("name", "qinyi");
stringRedisTemplate.opsForValue().set("gender", "male");
stringRedisTemplate.opsForValue().set("age", "19");
System.out.println(stringRedisTemplate.exec());
|
但是这种写法会报错,具体的原因是Spring Data Redis执行multi和exec时使用的不是同一个Connection。查找资料说可以使用如下写法:
1
2
3
4
5
6
7
8
|
redisTemplate.setEnableTransactionSupport(true)
stringRedisTemplate.multi();
stringRedisTemplate.opsForValue().set("name", "qinyi");
stringRedisTemplate.opsForValue().set("gender", "male");
stringRedisTemplate.opsForValue().set("age", "19");
System.out.println(stringRedisTemplate.exec());
|
在实践中该方法没有任何作用,我最终选择使用如下写法:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
stringRedisTemplate.execute(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
stringRedisTemplate.multi();
stringRedisTemplate.opsForValue().set("name", "qinyi");
stringRedisTemplate.opsForValue().set("gender", "male");
stringRedisTemplate.opsForValue().set("age", "19");
System.out.println(stringRedisTemplate.exec());
return "";
}
});
|
20220121后续:
在学习Spring Data Redis的事务部分时,发现官方的写法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
List<Object> txResults = redisTemplate.execute(new SessionCallback<List<Object>>() {
@Override
public List<Object> execute(RedisOperations operations) throws DataAccessException {
operations.multi();
operations.opsForSet().add("key", "values");
return operations.exec();
}
});
System.out.println("Number of items add to set: " + txResults.get(0));
|
Spring Data Redis提供了SessionCallback接口,供需要在同一个连接上执行多个操作时使用。
参考资料
- How to implement Redis Multi-Exec by using Spring-data-Redis