Spring Data Redis中使用Multi Exec

我第一尝试的方案如下:

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接口,供需要在同一个连接上执行多个操作时使用。

参考资料

  1. How to implement Redis Multi-Exec by using Spring-data-Redis