我将 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
}
有没有更好或更简单的方法?谢谢。