前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从海量数据里查出某一固定前缀的key

从海量数据里查出某一固定前缀的key

作者头像
名字是乱打的
发布2022-05-13 11:12:33
4330
发布2022-05-13 11:12:33
举报
文章被收录于专栏:软件工程
一 留意细节

摸清数据规模,即问清楚边界

方法1: 利用keys pattern

KEYS pattern:查找所有符合给定模式pattern的key eg: keys a* 找出所有以a开头的key

使用keys对线上业务的影响
  • KEYS指令一次性返回所有匹配的key
  • 键的数量过大会使服务卡顿
方法2:SCAN cursor match pattern count countnum

eg:scan 0 match *a count 10 从游标为0

  • 基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程
  • 以0作为游标开始一次新的迭代,直到命令返回游标0完成一次遍历
  • 不保证每次执行都返回某个给定数量的元素,支持模糊查询
  • 一次返回的数量不可控,只能大概率符合count参数
二.关于scan的使用

下面提供两个我自己包装的scan,一个是hash里模糊取key,另外一个是直接string key的模糊取

代码语言:javascript
复制
   @Override
    @SuppressWarnings("unchecked")
    public <T> Map<String, T> hScan(String key, String pattern) {
        final Map<String, T> scanResult = Maps.newHashMap();
        try (Cursor<Map.Entry<Object, Object>> cursor = template.opsForHash().scan(key, ScanOptions.scanOptions()
                .count(Integer.MAX_VALUE)
                .match(pattern)
                .build())) {
            while (cursor.hasNext()) {
                final Map.Entry<Object, Object> entry = cursor.next();
                scanResult.put(String.valueOf(entry.getKey()), (T) entry.getValue());
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return scanResult;
    }


  @Override
    public Set<String> scan(String pattern) {
        return template.execute((RedisCallback<Set<String>>) connection -> {
            Set<String> keysTmp = Sets.newHashSet();
            try (Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder()
                    .count(Integer.MAX_VALUE)
                    .match(pattern)
                    .build())) {
                while (cursor.hasNext()) {
                    keysTmp.add(new String(cursor.next()));
                }
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }
            return keysTmp;
        });
    }
三.关于scan的坑
  • COUNT 选项只是对增量式迭代命令的一种提示(hint),不能代表返回的个数,它只是限定服务器单次遍历的字典槽位数量(约等于)。
  • count要根据扫描数据量大小而定,Scan虽然无锁,但是也不能保证在超过百万数据量级别搜索效率;count不能太小,网络交互会变多,count要尽可能的大。在搜索结果集1万以内,建议直接设置为与所搜集大小相同

其他坑可以点这里看官网

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 留意细节
  • 方法1: 利用keys pattern
  • 使用keys对线上业务的影响
  • 方法2:SCAN cursor match pattern count countnum
  • 二.关于scan的使用
  • 三.关于scan的坑
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档