Pipelining
管道
Redis 提供了对pipelining 管道的支持。管道作用于两点:发送多个命令到服务端而不用等回应;在一个单独的步骤里读取所有的应答。当需要连续发送多个命令时,如连续添加多个元素到同一个集合,使用管道可以提高性能。
Spring Data Redis 提供了多个RedisTemplate 方法,使得可以使用管道来执行命令。如果你不关心管道操作的结果,你可以使用标准的execute 方法,并为管道参数传递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;
}
});
在上面的示例中,通过一个管道来执行操作,将大量的元素从一个队列中right pop 出来。结果List 中包含了所有弹出的内容。RedisTemplate 使用它的各种(值、哈希键、哈希值)序列化器,在返回之前将所有的结果进行反序列化。所以在上面的示例中返回的所有信息都是Strings。还有另外一个executePipelined 方法,可以为管道的结果传递一个自定义的序列化器。
注意,RedisCallback 返回的结果值必须为 null,管道命令返回的结果中会丢弃该值。
在1.1版本中,RedisConnection 的closePipeline 方法做了一个重大的改变。以前该方法从连接器直接返回管道操作的结果。这意味着这些数据类型和RedisConnection方法返回的是不同的。例如,zAdd方法返回一个boolean类型来标识一个元素已经被添加到sorted set中了。大多数连接器返回一个long类型的值,而由Spring Data Redis来执行转换。另外一个普遍的不同点是,大多数的连接器在执行完操作(如:set)后会返回一个应答状态(通常是OK字符串)。这些应答会被Spring Data Redis丢弃。在1.1之前,closePipeline 的结果不会被转化。如果这些改变破坏了你的应用,你可以在你的RedisConnectionFactory 中设置convertPipelineAndTxResults 为false 来disable 掉这些行为。