跳到主要内容
版本:4.1.1

流水线操作

Doubao 中英对照 Pipelining

Redis 支持流水线操作,即向服务器发送多条命令而不等待回复,然后在单个步骤中读取这些回复。当你需要连续发送多条命令时(例如向同一个 List 添加许多元素),流水线操作可以提高性能。

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

上例在流水线中对队列执行批量右弹出(right pop)操作。results List 包含所有被弹出的条目。RedisTemplate 使用其 value、hash key 和 hash value 序列化器在返回前反序列化所有结果,因此上例中返回的条目是 String。还有额外的 executePipelined 方法可让你为流水线结果传入自定义序列化器。

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

提示

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

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

:::

备注

流水线操作仅限于 Redis Standalone。Redis Cluster 目前只能通过 Lettuce 驱动支持,但使用跨槽位键(cross-slot keys)时以下命令除外:rename、renameNX、sort、bLPop、bRPop、rPopLPush、bRPopLPush、info、sMove、sInter、sInterStore、sUnion、sUnionStore、sDiff、sDiffStore。同槽位键则完全支持。