• Redis Scan 用法,Java代码演示


    1.概述

    由于 Redis 是单线程在处理用户的命令,而 Keys 命令会一次性遍历所有 Key,于是在 命令执行过程中,无法执行其他命令。这就导致如果 Redis 中的 key 比较多,那么 Keys 命令执行时间就会比较长,从而阻塞 Redis

    Keys 的缺点:

    1)没有limit,我们只能一次性获取所有符合条件的key,如果结果有上百万条,那么等待你的就是“无穷无尽”的字符串输出。
    2)keys命令是遍历算法,时间复杂度是O(N)。如我们刚才所说,这个命令非常容易导致Redis服务卡顿。因此,我们要尽量避免在生产环境使用该命令。
    相比于keys命令,Scan命令有两个比较明显的优势:
    1)Scan命令的时间复杂度虽然也是O(N),但它是分次进行的,不会阻塞线程。
    2)Scan命令提供了 count 参数,可以控制每次遍历的集合数。

    Scan 命令语法如下:
    SCAN cursor [MATCH pattern] [COUNT count]
    
    • 1
    1. cursor - 游标
    2. pattern - 匹配的模式
    3. count - 指定每次遍历多少个集合

    Scan 返回值为数组,会返回一个游标+一系列的 Key

            @Autowired
           private JedisCluster jedisCluster;
           
           jedisCluster.getClusterNodes().forEach((a, v) -> {
                Jedis jedis = null;
                jedis = v.getResource();
                ScanParams scanParams = new ScanParams();
                scanParams.match("match:point:congestion:grid*"); //此处是你要匹配的key
                scanParams.count(1024);
                String scanRet = "0";
                try {
                    do {
                        ScanResult result = jedis.scan(scanRet, scanParams);
                        scanRet = result.getCursor(); //每次都返回一个游标 当游标为0的时候证明
                        for (String key : result.getResult()) {
                            if (jedis.exists(key)) {
                                Map taskMap = jedis.hgetAll(key);
                                resutlist.add(taskMap);
                            }
                        }
                    } while (!scanRet.equals("0"));
                } catch (Exception e) {
                    log.error("查询失败,{}", e);
                } finally {
                    if (null != jedis)
                        jedis.close();
                }
            });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    [密码学入门]凯撒密码(Caesar Cipher)
    5 Dijkstra算法的设计--来源王英S同学
    第十一章《Java实战常用类》第5节:UUID类
    【Unity】【VR开发】针对VR项目的优化版Unity Build Settings
    2022.8.14 力扣1422. 分割字符串的最大得分
    大数据docker部署
    CC25 词语序列
    element-ui el-table-column 宽度不能动态设置问题
    遗传算法------微生物进化算法(MGA)
    subject may not be empty[Git]
  • 原文地址:https://blog.csdn.net/weixin_43123066/article/details/126777686