pipline操作会占用通道,mysql数据库查询也需要使用通道。通道只有一个。如果和数据库查询同时使用,会影响整体性能,因为pipline数据将管道填满,这时mysql就一直在等待,直到通道中有闲余的释放,mysql才会往管道中加数据,进行发送处理。mysql如果把通道填满,redis的pipline也只能等待。所以当redis的pipline和数据库查询同时使用时,会影响性能问题,这是开发时需要考虑的。
/**
* 使用pipline进行分批数据获取
*/
int num = 0;
int currentPipelineSize=110;
logger.error("piplinesize==========="+currentPipelineSize);
int dataSize=keys.size();
if (dataSize <= currentPipelineSize) {
num = 1;
currentPipelineSize = dataSize;
} else {
num = dataSize / currentPipelineSize + 1;
}
int index = 0;
List<String> ret=new ArrayList<String>();
List<Response<String>> responses=new ArrayList<Response<String>>();
for (int i = 0; i < num; i++) {
for (int j = 0; j < currentPipelineSize; j++) {
if((dataSize-1)>index||(dataSize-1)==index){
String key = keys.get(index);
responses.add(pipeline.get(key));
index++;
}
}
pipeline.sync();
for(Response<String> res:responses){
if(res!=null){
ret.add(res.get());
}
}
}
redis中的mget不是去占用通道的,可以和数据库命令传输同时进行,但是mget数据量过大的话也会对服务器性能造成影响
/**
*使用redis的mget进行分批处理
*/
jc = jpool.getResource();
//分批使用mget
List<String> ret=new ArrayList<String>();
int dataSize=keys.size();
int currentSize=50;
if (dataSize <= currentSize) {
currentSize = dataSize;
}
//logger.error("使用分批mget========================="+currentSize);
//返回结果
List<List<String>> results = new ArrayList<List<String>>();
//分隔后的集合个数
int count = (dataSize + currentSize - 1) / currentSize;
for (int i = 0; i < count; i++) {
List<String> subList = keys.subList(i * currentSize, ((i + 1) * currentSize > dataSize ? dataSize : currentSize * (i + 1)));
results.add(subList);
}
for(List<String> result:results){
List<String> re=new ArrayList<String>();
re=jc.mget(result.toArray(new String[result.size()]));
if(re!=null&&re.size()>0){
ret.addAll(re);
}
}
return ret;