首页 > 数据库 >Spring Redis 模糊查询匹配key

Spring Redis 模糊查询匹配key

时间:2022-11-21 17:14:47浏览次数:73  
标签:return curs Spring Redis key pattern new redisTemplate

背景

原方法在Redis内存储条数过多时效率较低,尝试进行改良。修改模糊查询方式后有效提高查询效率。

改良步骤

原方法

原模糊查询方法采用ScanOptions匹配key的前缀,但并未设置游标步进值,导致其实际效率可能跟使用keys命令相同。

改进

  1. 改用lettuce api RedisAsynCommands构建Redis连接。
  2. 加入游标步进值实现迭代查询。
  3. 由于scan命令可能得到重复的key,使用set进行去重。
参考代码
/**
     * 获取 指定格式的所有key
     * 迭代执行 SCAN 0 MATCH {pattern} COUNT 10000
     *
     * @param redisTemplate redisTemplate
     * @param pattern       匹配规则
     * @return 指定格式的所有key
     */
    public static List<String> scanKeys(RedisTemplate redisTemplate, String pattern) {
        //SCAN 0 MATCH {pattern} COUNT 10000
        return (List<String>) redisTemplate.execute(connection -> {
            //scan 迭代遍历键,返回的结果可能会有重复,需要客户端去重复
            Set<String> redisKeys = new HashSet<>();
            //lettuce 原生api
            RedisAsyncCommands conn = (RedisAsyncCommands) connection.getNativeConnection();
            //游标
            ScanCursor curs = ScanCursor.INITIAL;
            try {
                //采用 SCAN 命令,迭代遍历所有key
                while (!curs.isFinished()) {
                    long count = 10000L;
                    ScanArgs args = ScanArgs.Builder.matches(pattern).limit(count);
                    log.info("SCAN {} MATCH {} COUNT {}", curs.getCursor(), pattern, count);
                    RedisFuture<KeyScanCursor<byte[]>> future = conn.scan(curs, args);
                    KeyScanCursor<byte[]> keyCurs = future.get();
                    List<byte[]> ks = keyCurs.getKeys();
                    Set<String> set = ks.stream().map(bytes -> new String(bytes, StandardCharsets.UTF_8)).collect(Collectors.toSet());
                    log.info("return size:{}", set.size());
                    redisKeys.addAll(set);
                    curs = keyCurs;
                }
            } catch (InterruptedException | ExecutionException e) {
                throw new RuntimeException(e);
            }
            return new ArrayList<>(redisKeys);
        }, true);
    }

参考:
https://blog.csdn.net/drhrht/article/details/126489560

标签:return,curs,Spring,Redis,key,pattern,new,redisTemplate
From: https://www.cnblogs.com/zccfrancis/p/16911950.html

相关文章

  • Spring OrderUtils工具的使用
    源码地址源码阅读仓库:[SourceHot](https://github.com/SourceHot/spring-framework-read)org.springframework.core.annotation.OrderUtils主要方法如下getOrdergetP......
  • HM-RocketMQ2.3【SpringBoot整合Dubbo】
    1前置条件安装依赖包下载dubbo-spring-boot-starter依赖包将dubbo-spring-boot-starter安装到本地仓库mvninstall-Dmaven.skip.test=true注意springboot整......
  • Redis知识
    1redis是什么https://www.cnblogs.com/qqflying/p/9192331.htmlredis-RemoteDictionaryServer(即远程字典服务),是一个开源的、使用C语言编写的、支持网络交互的、......
  • rdb-tools查询大key
    用redis自带命令查询大keyredis-cli-h192.168.246.74-p6390--bigkeysyuminstallpython-devel#在安装python-lzf之前,要安装python-devel依赖包,否则安装会失败ln-s......
  • SpringBean生命周期
    SpringBean生命周期(~)简述:实例化(instantiateBean)——属性赋值(populateBean)——初始化(init)——销毁(destroy)详细:创建bean通过xml/注解@(Bean)。。等等方式注册bea......
  • 20221121 Spring Boot 整合
    从Maven依赖关系分析spring-boot-starter-web|--spring-boot-starter-json|--|--jackson-databindSpringBoot配置属性参考org.springframework.boot.autoconfigu......
  • Redis学习笔记
    什么是NoSQL相对于传统的关系型数据库(MySQL、Oracle等)的行列模式,在大数据时代很难正常运行,所以产生了NoSQL的一种数据库用来存储访问量比较高的数据,常见的NoSQL数据库有......
  • Spring Boot拦截器
    SpringMVC中提供了拦截器功能,可以根据URL对请求进行拦截,主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能上。SpringBoot同样提供了拦截器功能。 ......
  • Spring Data (数据)MongoDB
    版本4.0.0SpringDataMongoDB项目将Spring的核心概念应用于使用MongoDB文档样式数据存储的解决方案的开发。我们提供了一个“模板”作为存储和查询文档的高级抽象。您可能......
  • 【Python】字典dict_相同key,不同value的添加方法
     dict.setdefault(key,[]).append(value) #coding:utf-8fromloguruimportloggeraslogsclassdemo:defrun(self):new_dict={}#......