• SpringBoot中使用Redis的keys替代方案scan


    众所周知redis的keys命 在测试环境这样开发没有问题, 由于项目对redis依赖比较大, 就网上找了一些关于redis的keys命令, 得知keys命令执行的时候会严重阻塞线上其它命令的正常请求, 于是做了以下替代方案

          前同事留下的坑 优化redis时候记录下,也可以代码循环手动删除对应的key

      

    /**
         *  获取指定前缀的一系列key
         *  使用scan命令代替keys, Redis是单线程处理,keys命令在KEY数量较多时,
         *  操作效率极低【时间复杂度为O(N)】,该命令一旦执行会严重阻塞线上其它命令的正常请求
         * @param keyPrefix
         * @return
         */
        public Set<String> keys(String keyPrefix) {
            String realKey = "*" + keyPrefix + "*";
            try {
                return redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
                    Set<String> binaryKeys = new HashSet<>();
                    Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(realKey).count(Integer.MAX_VALUE).build());
                    while (cursor.hasNext()) {
                        binaryKeys.add(new String(cursor.next()));
                    }
                    return binaryKeys;
                });
            } catch (Throwable e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         *  删除指定前缀的一系列key
         * @param keyPrefix
         */
        public void removeAll(String keyPrefix) {
            try {
                Set<String> keys = keys(keyPrefix);
                redisTemplate.delete(keys);
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }

    生成环境不可直接用!!!      错误用法

     Set<String> keys = redisUtil.keys(accessTokenKey + ":*");
    redisUtil.del(keys);
  • 相关阅读:
    you have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'varchar(255), sort integer not null
    mysql导出数据到excel的两种方式
    java8 foreach不能使用break、countinue
    学习rabbitmq
    shell脚本基础
    编程基础;程序的执行方式;编程基本概念
    定制vim的工作特性
    使用多个“窗口”
    多文件模式
    可视化模式
  • 原文地址:https://www.cnblogs.com/shanheyongmu/p/15873914.html
Copyright © 2020-2023  润新知