如何实现将命令列表作为输入的Jedis流水线操作?

时间:2016-08-02 02:21:38

标签: java redis jedis pipelining

我使用redis和java使用Jedis作为redis-client。我有一个班级

public class RedisDBManager

其中包含调用Jedis在redis上执行命令的方法。

RedisDBManager

中的示例方法
  public Set<NTuple> zrangeWithScores(String key, int min, int max)
  {
      JedisSentinelPool localPool = redisSentinelPool;
      Jedis redis = null;
      try
      {
          redis = getResource();
          Set<Tuple> tupleSet = redis.zrangeWithScores(key, min, max);
          Set<NTuple> tuples = new LinkedHashSet<>();
          for (Tuple tuple : tupleSet) {
             tuples.add(new NTuple(tuple.getElement(), tuple.getScore()));
          }
          return tuples;
      }
      catch (JedisConnectionException jex) {
         logger.error("Creating new connection since it encountered Jedis Connection Exception: ",jex);
         createNewConnectionPool(localPool);
         try {
            redis = getResource();
            Set<Tuple> tupleSet = redis.zrangeWithScores(key, min, max);
            Set<NTuple> tuples = new LinkedHashSet<>();
            for (Tuple tuple : tupleSet) {
               tuples.add(new NTuple(tuple.getElement(), tuple.getScore()));
            }
            return tuples;
         }
         catch (Exception e){
            logger.error("Exception: ", e);
            return null;
         }
      }
      catch (Exception ex) {
         logger.error("Exception: ", ex);
         return null;
      }
      finally
      {
          if (redis != null)
          {
              returnResource(redis);
          }
      }
  }

此方法getResource从 JedisSentinelPool 返回资源。

我想在此类中使用流水线方法,以便它执行一系列命令并将响应作为列表返回。我希望Jedis的任何构造都不应该在 RedisDBManager 之外使用,因为在外部方法中应该调用管道传输方法来处理所有责任。

此问题与this question类似。它的不同之处在于我想要使用不同的redis命令并得到它们的响应。

我目前的不完整方法是修改RedisDBManager中的所有方法,以接受是否将它传递给线程本地Pipeline对象,然后使用流水线方法同步此管道对象并返回响应。

类似的东西:

public Set<NTuple> zrangeWithScores(String key, int min, int max, boolean pipelined) {
    ...
    try 
    {
        if (pipelined) {
            pipeline = getExistingThreadLocalPipelineObject();
            pipeline.zrangeWithScores(key, min, max);
        } else {
            redis = getResource();
            ...
            return tuples;
    }
    catch (JedisConnectionException jex) {
        ...
            if (pipelined) {
            pipeline = getExistingThreadLocalPipelineObject();
            pipeline.zrangeWithScores(key, min, max);
        } else {
            redis = getResource();
            ...
            return tuples;
    ...
}

public List<MyResponse> syncPipeline() {
    pipeline = getExistingThreadLocalPipelineObject();
    pipeline.sync();
    //process all responses and send
}

有更好或更简单的方法吗?感谢。

0 个答案:

没有答案