1

我将 Redis 与 java 一起使用,使用 Jedis 作为 redis 客户端。我有一堂课

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之外使用,因为外部方法应该调用负责所有职责的流水线方法。

这个问题类似于这个问题。它的不同之处在于我也想使用不同的 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
}

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

4

0 回答 0