【Spring连载】使用Spring Data访问Redis(十二)----Redis管道Pipelining

【Spring连载】使用Spring Data访问Redis(十二)----管道Pipeline


Redis提供了对管道(pipelining)的支持,这包括在不等待回复的情况下向服务器发送多个命令,然后在一个步骤中读取回复。当你需要在一行中发送多个命令(例如向同一列表中添加多个元素)时,管道可以提高性能。
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;
  }
});

前面的示例在管道中的队列中运行一组条目的弹出(right pop)。结果列表包含所有弹出的项目。RedisTemplate在返回之前使用其value、hash key和hash value序列化器对所有结果进行反序列化,因此前面示例中返回的项是Strings。还有其他executePipelined方法,可以让你为管道结果传递自定义序列化程序。
请注意,RedisCallback返回的值必须为null,因为为了返回管道命令的结果,会丢弃此值。
Lettuce驱动程序支持细粒度的刷新控制,允许在命令出现时刷新命令,缓冲或在连接关闭时发送命令。

LettuceConnectionFactory factory = // ...
factory.setPipeliningFlushPolicy(PipeliningFlushPolicy.buffered(3)); -----1

1. 本地缓冲,每3个命令后刷新一次。

你可能感兴趣的:(spring,redis,java)