管道

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

Spring Data Redis 提供了几种 RedisTemplate 方法,用于在管道中运行命令。如果您不关心管道操作的结果,可以使用标准的 execute 方法,并为 pipeline 参数传递 trueexecutePipelined 方法在管道中运行提供的 RedisCallbackSessionCallback,并返回结果,如下例所示

//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 使用其值、哈希键和哈希值序列化器来反序列化所有结果,然后再返回,因此前面示例中返回的项是 Strings。还有其他的 executePipelined 方法,可让您为管道结果传递自定义序列化器。

请注意,RedisCallback 返回的值必须为 null,因为此值将被丢弃,而倾向于返回管道命令的结果。

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

LettuceConnectionFactory factory = // ...
factory.setPipeliningFlushPolicy(PipeliningFlushPolicy.buffered(3)); (1)
1 在本地缓冲并在每 3 个命令后刷新。
管道仅限于 Redis Standalone。Redis 集群当前仅通过 Lettuce 驱动程序支持,但使用跨槽密钥时,以下命令除外:renamerenameNXsortbLPopbRPoprPopLPushbRPopLPushinfosMovesIntersInterStoresUnionsUnionStoresDiffsDiffStore。完全支持同槽密钥。