当我们使用Redis队列进行大量数据存取时,RPUSH可以实现一次存入多条数据,而逐条LPOP性能往往不尽如人意。这时就需要批量读取List中的数据再进行处理,减少redis读写次数。幸好redis提供了lrange方法,可以实现list的批量读取。
Java代码如下:
public static void main(String[] args) {
Jedis jedis = null;
String listName = "test";
String redisHost = "localhost";
String redisPwd = "123456";
int redisPort = 6379;
int i = 0;
Long begin = Calendar.getInstance().getTimeInMillis();
try {
List list=new ArrayList();
//获取jedis连接
jedis = JedisUtil.getDataJedis(redisHost, redisPort, redisPwd);
while (true) {
//从List批量获取数据,每次取200条
list = jedis.lrange(listName,0,199);
int num=list.size();
if(num == 0){
Thread.sleep(1000);
continue;
}
System.out.println("从list获取到"+num+"条数据");
//将list做修剪,去掉已经读出的数据
jedis.ltrim(listName,num,-1);
i+=num;
if (i>10000){
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if (jedis!=null){
jedis.close();
}
}
Long end = Calendar.getInstance().getTimeInMillis();
System.out.println("读取"+i+"条共耗时:[" + (end-begin)+"]ms");
}
这是使用RPUSH,LPOP的情况,如果是从左端写入的lpush怎么办呢?别急 Lrange还可以从右侧读取,只要把游标改成负数即可,-1即队列最后一条数据。注意标号要从左到右。另外lrange的标号参数都是左右包含的闭区间。
try {
List list=new ArrayList();
jedis = JedisUtil.getDataJedis(redisHost, redisPort, redisPwd);
while (true) {
//从List右侧批量获取数据,每次取200条
list = jedis.lrange(listName,-200,-1);
int num=list.size();
if(num == 0){
Thread.sleep(1000);
continue;
}
System.out.println("从list获取到"+num+"条数据");
jedis.ltrim(listName,0,-201);
i+=num;
if (i>10000){
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if (jedis!=null){
jedis.close();
}
}