Redis的key的获取
redis的所有的key的获取一、获取方式redis的命令keys(*) 可以获取所有的key。但是此种方式当数据量大的时候,会产生阻塞的情况。redis的key还可以通过scan命令获取key。scan采用渐进式遍历的方式来解决keys命令可能带来的阻塞问题与SCAN 命令相关的命令: 与SCAN 命令相关的命令还有 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令,都是用于增量地迭代(
redis的所有的key的获取
一、获取方式
redis的命令keys(*) 可以获取所有的key。但是此种方式当数据量大的时候,会产生阻塞的情况。
redis的key还可以通过scan命令获取key。scan采用渐进式遍历的方式来解决keys命令可能带来的阻塞问题
与SCAN 命令相关的命令:
与SCAN 命令相关的命令还有 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令,都是用于增量地迭代(incrementally iterate)一集元素(a collection of elements),区别在于:
1、SCAN 命令用于迭代当前数据库中的数据库键,返回的每个元素都是一个数据库键;
2、SSCAN 命令用于迭代集合键中的元素,返回的每个元素都是一个集合成员;
3、HSCAN 命令用于迭代哈希键中的键值对,返回的每个元素都是一个键值对,一个键值对由一个键和一个值组成。
4、ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值),返回的每个元素都是一个有序集合元素,一个有序集合元素由一个成员(member)和一个分值(score)组成。
二、使用步骤
1.引入库
SCAN 命令对应java的 Jedis 中的操作示例如下:
public static void testScan(Jedis jedis){
// 游标初始值为0
String cursor = ScanParams.SCAN_POINTER_START;
String key = "PLFX-ZZSFP-*";
ScanParams scanParams = new ScanParams();
scanParams.match(key);// 匹配以 PLFX-ZZSFP-* 为前缀的 key
scanParams.count(1000);
while (true){
//使用scan命令获取数据,使用cursor游标记录位置,下次循环使用
ScanResult<String> scanResult = jedis.scan(cursor, scanParams);
cursor = scanResult.getStringCursor();// 返回0 说明遍历完成
List<String> list = scanResult.getResult();
long t1 = System.currentTimeMillis();
for(int m = 0;m < list.size();m++){
String mapentry = list.get(m);
System.out.println(mapentry);
//jedis.del(key, mapentry);
}
long t2 = System.currentTimeMillis();
System.out.println("获取" + list.size()
+ "条数据,耗时: " + (t2-t1) + "毫秒,cursor:" + cursor);
if ("0".equals(cursor)){
break;
}
}
}
SSCAN 命令对应的 Jedis 中的操作如下:
代码如下(示例):
public static void testSscan(Jedis jedis) {
// 游标初始值为0
String cursor = ScanParams.SCAN_POINTER_START;
ScanParams scanParams = new ScanParams();
scanParams.count(1000);
String key = "PLFX-ZZSFP";
while (true) {
//使用sscan命令获取数据,使用cursor游标记录位置,下次循环使用
ScanResult<String> sscanResult = jedis.sscan(key, cursor, scanParams);
cursor = sscanResult.getStringCursor();// 返回0 说明遍历完成
List<String> scanResult = sscanResult.getResult();
long t1 = System.currentTimeMillis();
for (int m = 0; m < scanResult.size(); m++) {
String mapentry = scanResult.get(m);
System.out.println(mapentry);
jedis.srem(key, mapentry);//处理过程,可以换成其他的
}
long t2 = System.currentTimeMillis();
System.out.println("处理" + scanResult.size() + "条数据,耗时: " + (t2 - t1) + "毫秒,cursor:" + cursor);
if ("0".equals(cursor)) {
break;
}
}
}
HSCAN 命令对应的 Jedis 中的操作如下:
public static void testHcan(Jedis jedis) {
// 游标初始值为0
String cursor = ScanParams.SCAN_POINTER_START;
ScanParams scanParams = new ScanParams();
scanParams.count(1000);
String key = "PLFX-ZZSFP";
while (true) {
//使用hscan命令获取数据,使用cursor游标记录位置,下次循环使用
ScanResult<Map.Entry<String, String>> hscanResult = jedis.hscan(key, cursor, scanParams);
cursor = hscanResult.getStringCursor();// 返回0 说明遍历完成
List<Map.Entry<String, String>> scanResult = hscanResult.getResult();
long t1 = System.currentTimeMillis();
for (int m = 0; m < scanResult.size(); m++) {
Map.Entry<String, String> mapentry = scanResult.get(m);
System.out.println(mapentry);
jedis.hdel(key, mapentry.getKey());//处理过程,可以换成其他的
}
long t2 = System.currentTimeMillis();
System.out.println("处理" + scanResult.size() + "条数据,耗时: " + (t2 - t1) + "毫秒,cursor:" + cursor);
if ("0".equals(cursor)) {
break;
}
}
}
ZSCAN 命令对应的 Jedis 中的操作如下:
public static void testZscan(Jedis jedis) {
// 游标初始值为0
String cursor = ScanParams.SCAN_POINTER_START;
String key = "PLFX-ZZSFP-*";
ScanParams scanParams = new ScanParams();
scanParams.match(key);// 匹配以 PLFX-ZZSFP-* 为前缀的 key
scanParams.count(1000);
while (true) {
//使用 zscan 命令获取数据,使用cursor游标记录位置,下次循环使用
ScanResult<Tuple> scanResult = jedis.zscan(key, cursor, scanParams);
cursor = scanResult.getStringCursor();// 返回0 说明遍历完成
List<Tuple> list = scanResult.getResult();
long t1 = System.currentTimeMillis();
for (int m = 0; m < list.size(); m++) {
Tuple tuple = list.get(m);
System.out.println("Element:" + tuple.getElement() + ",Score:" + tuple.getScore());
}
long t2 = System.currentTimeMillis();
System.out.println("处理" + list.size() + "条数据,耗时: " + (t2 - t1) + "毫秒,cursor:" + cursor);
if ("0".equals(cursor)) {
break;
}
}
}
总结
在项目中用到获取redis的key的方式,在此学习。
https://www.cnblogs.com/ljch/p/12230235.html
更多推荐
所有评论(0)