跳到主要内容

流水线

DeepSeek V3 中英对照 Pipelining

Redis 提供了对管道的支持,管道技术允许在不等待服务器回复的情况下连续发送多个命令,然后再一次性读取所有回复。当你需要连续发送多个命令时(例如向同一个列表中添加多个元素),管道技术可以显著提高性能。

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;
}
});
java

前面的示例在一个管道中批量从队列中右弹出项目。results List 包含了所有弹出的项目。RedisTemplate 使用其值、哈希键和哈希值序列化器在返回之前对所有结果进行反序列化,因此前面示例中返回的项目是字符串类型。还有一些额外的 executePipelined 方法允许你为管道结果传递自定义的序列化器。

请注意,从 RedisCallback 返回的值必须为 null,因为此值会被丢弃,转而返回流水线命令的结果。

提示

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

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

备注

管道操作仅限于 Redis 单机模式。Redis 集群目前仅通过 Lettuce 驱动程序支持,但在使用跨槽键时,以下命令除外:renamerenameNXsortbLPopbRPoprPopLPushbRPopLPushinfosMovesIntersInterStoresUnionsUnionStoresDiffsDiffStore。同槽键完全支持。