Pipelining

Redis 提供了对 pipelining 的支持,其中涉及向服务器发送多个命令而不等待回复,然后在单步中读取回复。当您需要连续发送多个命令时(例如将许多元素添加到同一个列表中),管道处理可以提高性能。

Spring Data Redis 为在管道中运行命令提供了几个`RedisTemplate`方法。如果你不关心管道操作的结果,你可以使用标准的`execute`方法,为`pipeline`参数传递`true`。executePipelined`方法在管道中运行提供的`RedisCallback`或`SessionCallback,并返回结果,如下例所示:

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

前面的示例在管道中运行队列中项目的批量右弹出。results `List`包含所有弹出的项目。`RedisTemplate`使用其值、哈希键和哈希值序列化器在返回之前反序列化所有结果,因此前面的示例中返回的项目是字符串。还有其他`executePipelined`方法可以让你为管道结果传递一个自定义序列化器。

请注意,从`RedisCallback`返回的值必须为`null`,因为该值将被丢弃,以返回管道命令的结果。

Lettuce 驱动程序支持细粒度的刷新控制,它允许在命令出现时刷新命令,缓冲或在连接关闭时发送命令。

LettuceConnectionFactory factory = // ...
factory.setPipeliningFlushPolicy(PipeliningFlushPolicy.buffered(3)); 1
1 在本地缓冲,并在每第 3 个命令后刷新。