流水线
Redis 提供了对管道的支持,管道技术允许在不等待服务器回复的情况下连续发送多个命令,然后再一次性读取所有回复。当你需要连续发送多个命令时(例如向同一个列表中添加多个元素),管道技术可以显著提高性能。
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
在本地缓冲,并在每 3 个命令后刷新。
管道操作仅限于 Redis 单机模式。Redis 集群目前仅通过 Lettuce 驱动程序支持,但在使用跨槽键时,以下命令除外:rename
、renameNX
、sort
、bLPop
、bRPop
、rPopLPush
、bRPopLPush
、info
、sMove
、sInter
、sInterStore
、sUnion
、sUnionStore
、sDiff
、sDiffStore
。同槽键完全支持。