管道
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 = (StringRedisConnection)connection;
for(int i=0; i< batchSize; i++) {
stringRedisConn.rPop("myqueue");
}
return null;
}
});
前面的示例在管道中运行从队列批量右弹出的项。results
List
包含所有弹出的项。RedisTemplate
使用其值、哈希键和哈希值序列化器来反序列化所有结果,然后再返回,因此前面示例中返回的项是 Strings。还有其他的 executePipelined
方法,可让您为管道结果传递自定义序列化器。
请注意,RedisCallback
返回的值必须为 null
,因为此值将被丢弃,而倾向于返回管道命令的结果。
Lettuce 驱动程序支持细粒度的刷新控制,允许在命令出现时刷新命令、缓冲命令或在连接关闭时发送命令。
|
管道仅限于 Redis Standalone。Redis 集群当前仅通过 Lettuce 驱动程序支持,但使用跨槽密钥时,以下命令除外:rename 、renameNX 、sort 、bLPop 、bRPop 、rPopLPush 、bRPopLPush 、info 、sMove 、sInter 、sInterStore 、sUnion 、sUnionStore 、sDiff 、sDiffStore 。完全支持同槽密钥。 |