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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐