springboot Redistemplate的execute和 executePipelined


springboot 的 RedisTemplate 的 execute 和 executePipelined 功能的区别

1.execute

以下是 springboot 官网原文:

Redis provides support for transactions through the multiexec, and discard commands. These operations are available on RedisTemplate, however RedisTemplate is not guaranteed to execute all operations in the transaction using the same connection.

Spring Data Redis provides the SessionCallback interface for use when multiple operations need to be performed with the same connection, as when using Redis transactions. For example:

```

 //execute a transaction
List txResults = redisTemplate.execute(new SessionCallback>() {
    public List execute(RedisOperations operations) throws DataAccessException {
        operations.multi();
        operations.opsForSet().add("key", "value1");
        // This will contain the results of all ops in the transaction
        return operations.exec();
    }
});

 ```

翻译下来就是:

Redis 通过multi, exec, discard 操作提供事务支持. RedisTemplate 也同样支持这些操作, 然而 RedisTemplate 不保证在同一个连接中执行事务中的所有操作.

当使用 redis 的事务的时候,  Spring Data Redis 提供 SessionCallback 的接口支持多个操作的执行都在同一个连接中.

2.Pipeline

Redis provides support for pipelining, which involves sending multiple commands to the server without waiting for the replies and then reading the replies in a single step. Pipelining can improve performance when you need to send several commands in a row, such as adding many elements to the same List.

Spring Data Redis provides several RedisTemplate methods for executing commands in a pipeline. If you don't care about the results of the pipelined operations, you can use the standard execute method, passing true for the pipeline argument. The executePipelined methods will execute the provided RedisCallback or SessionCallback in a pipeline and return the results. For example:

Redis 提供 pipelining(管道) 的支持,  它可以发送多条指令到 redis服务端 而不用等待服务端的回复 并且 读取服务端的回复在一步操作中. 当你需要连续发送多条命令的时候 Pipelining(管道) 可以改善性能, such as 添加多个元素到同一个list中.

Spring Data Redis 提供几个 RedisTemplate 的方法支持在一个 pipeline(管道) 中执行多个指令.如果不关注管道操作的结果, 可以使用标准的execute方法, 传递true 的pipeline参数.

executePipelined 方法会执行 RedisCallback or SessionCallback 的回调方法以返回结果.

```

//pop a specified number of items from a queue
List results = stringRedisTemplate.executePipelined(new RedisCallback() {
    public Object doInRedis(RedisConnection connection) throws DataAccessException {
        StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
        for(int i=0; i< batchSize; i++) {
            stringRedisConn.rPop("myqueue");
        }
        return null;
    }
});

```

在redis官网中: ( 官网地址: https://redis.io/topics/pipelining )

从  It's not just a matter of RTT 这一段开始, pipeline不仅仅是不用等待回复时间(RTT)就可以持续的发送指令. 并且使用 pipeline的时候, redis用一个read()操作读取多个指令,并且 通过一个 write() 传递多个结果.最终的结果, 使用 pipeline 的效率甚至能相当于不使用pipeline的 10 倍.

(来张官网的图)