管道化

Redis 提供对管道(pipelining)的支持,该机制允许在不等待服务器回复的情况下连续发送多个命令,然后在单个步骤中读取所有回复。当你需要连续发送多个命令时(例如向同一个列表中添加大量元素),管道可以提升性能。spring-doc.cadn.net.cn

Spring Data Redis 提供了多个 RedisTemplate 方法用于在管道(pipeline)中执行命令。如果您不关心管道操作的结果,可以使用标准的 execute 方法,并将 true 参数设为 pipelineexecutePipelined 方法会在管道中执行所提供的 RedisCallbackSessionCallback 并返回结果,如下例所示:spring-doc.cadn.net.cn

//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 = new DefaultStringRedisConnection(connection);
      for(int i=0; i< batchSize; i++) {
        stringRedisConn.rPop("myqueue");
      }
    return null;
  }
});

前面的示例在管道中对队列中的元素执行批量右弹出操作。 results List 包含所有被弹出的元素。RedisTemplate 在返回结果之前,会使用其值、哈希键和哈希值的序列化器对所有结果进行反序列化,因此前面示例中返回的元素均为字符串。 此外,还有其他 executePipelined 方法,允许你为管道操作的结果传入自定义的序列化器。spring-doc.cadn.net.cn

请注意,从 RedisCallback 返回的值必须为 null,因为该值会被丢弃,转而返回流水线命令的结果。spring-doc.cadn.net.cn

Lettuce 驱动程序支持细粒度的刷新控制,允许在命令出现时立即刷新、缓冲,或在连接关闭时发送命令。spring-doc.cadn.net.cn

LettuceConnectionFactory factory = // ...
factory.setPipeliningFlushPolicy(PipeliningFlushPolicy.buffered(3)); (1)
1 本地缓冲,并在每第3条命令后刷新。
流水线处理仅限于 Redis 独立模式。 Redis 集群目前仅通过 Lettuce 驱动程序支持,但在使用跨槽键时以下命令除外:renamerenameNXsortbLPopbRPoprPopLPushbRPopLPushinfosMovesIntersInterStoresUnionsUnionStoresDiffsDiffStore。 同槽键已完全支持。