我使用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
}
有更好或更简单的方法吗?感谢。