Spring Data Redis(Pipeling)

来源:互联网 发布:手机淘宝购买运费险 编辑:程序博客网 时间:2024/06/12 19:53

Pipelining
管道

Redis 提供了对pipelining 管道的支持。管道作用于两点:发送多个命令到服务端而不用等回应;在一个单独的步骤里读取所有的应答。当需要连续发送多个命令时,如连续添加多个元素到同一个集合,使用管道可以提高性能。

Spring Data Redis 提供了多个RedisTemplate 方法,使得可以使用管道来执行命令。如果你不关心管道操作的结果,你可以使用标准的execute 方法,并为管道参数传递true。executePipelined 这个方法可以在管道中执行RedisCallback 或者 SessionCallback,并返回结果。

代码示例如下 :

//pop a specified number of items from a queueList<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 掉这些行为。