Redis模糊匹配Key值

使用Redis的scan代替Keys指令:

public Set<String> scan(String matchKey) {
Set<String> keys = (Set<String>)redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
Set<String> keysTmp = new HashSet<>();
Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder()
.match("*" + matchKey + "*").count(1000).build());
while (cursor.hasNext()) {
keysTmp.add(new String(cursor.next()));
}
return keysTmp;
}); return keys;
}

为什么不建议用Keys

对于生产环境上,有时我们需要从成千上万的key中,找出我们指定的key,也就是模糊匹配出来的key,redis提供了一个简单粗暴的命令:keys,它可以用来列出所有满足特定正则字符串规则的 key。

但是因为这个命令没有offset、limit参数,一次性吐出所有满足条件的key,假如有上百万个key符合条件则会打崩Redis服务器。

scan命令

特点如下:

  • 复杂度和keys命令一样,也是 O(n),但是它是通过游标分步进行的,不会阻塞线程
  • 提供limit参数,可以控制每次返回结果的最大条数,这里是最大条数,而不是等于limit的条数,因为是匹配查询,是在limit的范围内匹配查询
  • 返回的结果可能会有重复
  • 遍历的过程中如果有数据修改,改动后的数据能不能遍历到是不确定的;
  • 单次返回的结果是空的并不意味着遍历结束,而要看返回的游标值是否为零;

scan优势

​ Java中HashMap的底层实现结构,是数组+链表的形式,在JDK1.7之后还加入了红黑树,在Redis当中,所有的

key都存储在一个很大的字典中,这个字典结构就是一维数组+二维链表的结构,scan指令返回的游标就是第一维

数组的位置索引,这个位置索引称为槽 (slot)。 如果不考虑字典的扩容缩容,直接按数组下标挨个遍历就行了。

limit 参数就表示需要遍历的槽位数,之所以返回的结果可能多可能少,是因为不是所有的槽位上都会挂接链表,

有些槽 位可能是空的,还有些槽位上挂接的链表上的元素可能会有多个。每一次遍历都会将 limit 数量的槽位上挂

接的所有链表元素进行模式匹配过滤后,一次性返回给客户端。

Redis如何模糊匹配Key值的更多相关文章

  1. stackExchange.redis 实现模糊匹配批量查询

    如果使用redis的频次较高,那么业务中经常会出现需要根据关键字进行批量查询,所以总结一下StackExchange中使用批量查询的方法(如果数据量很大,那么在redis中模糊查询很耗时,请慎用!) ...

  2. springboot redis 监听过期key值事件

    redis 中的key值过期后,触发通知事件 1.创建springboot工程,创建监听类 maven配置 <dependencies> <dependency> <gr ...

  3. Spring Data操作Redis时,发现key值出现 \xac\xed\x00\x05t\x00\tb

    原文链接:http://blog.csdn.net/yunhaibin/article/details/9001198 最近在研究redis,以及spring data对redis的支持发现了一个奇怪 ...

  4. redis 模糊删除key

    redis-cli KEYS "pattern" | xargs redis-cli DEL Redis keys命令支持模式匹配,但是del命令不支持模式匹配,有时候需要根据一定 ...

  5. 通过匹配绑定select option的文本值 模糊匹配

    //通过匹配绑定select option的文本值 模糊匹配 $(".class option:contains('文本值')").attr("selected" ...

  6. mySql一个字段的值模糊匹配多表多列的查询

    1.dao层/** * 分页查询点卡集合信息 * @param tid 游戏类型编号 * @param gid 游戏编号 * @param searchInfo 包括(点卡名称,游戏名称,点卡面值,游 ...

  7. OVS 内核KEY值提取及匹配流表代码分析

    原文链接:http://ry0117.com/2016/12/24/OVS内核KEY值提取及匹配流表代码分析/ 当开启OVS后,创建datapath类型为system的网桥并他添加相关接口,OVS网桥 ...

  8. zabbix监控redis的key值

    配置zabbix客户端配置文件 vim /etc/zabbix/zabbix_agentd.conf 添加  Include=/etc/zabbix/zabbix_agentd.d/ 添加脚本对red ...

  9. Redis删除特定前缀key的优雅实现

    还在用keys命令模糊匹配删除数据吗?这就是一颗随时爆炸的炸弹! Redis中没有批量删除特定前缀key的指令,但我们往往需要根据前缀来删除,那么究竟该怎么做呢?可能你一通搜索后会得到下边的答案 re ...

  10. Redis 通配符批量删除key

    问题: 线上有部分的redis key需要清理. 一. 由于Keys模糊匹配,请大家在实际运用的时候忽略掉.因为Keys会引发Redis锁,并且增加Redis的CPU占用,情况是很恶劣的, 官网说明如 ...

随机推荐

  1. 使用mysql5.7版本的mysqldump备份mysql8.0版本的数据库报错解决办法

    使用mysql5.7版本的mysqldump命令执行备份mysql8.0版本的数据库时会报错: mysqldump: Couldn't execute 'SET SQL_QUOTE_SHOW_CREA ...

  2. Deployment故障排除图解

    PDF文件下载地址:https://files.cnblogs.com/files/sanduzxcvbnm/troubleshooting-kubernetes.pdf

  3. 20_IO

    IO框架 一. 流的概念 概念:内存与存储设备之间传输数据的通道 水借助管道传输:数据借助流传输 二. 流的分类 按方向[重点] 输入流:将<存储设备>中的内容读入到<内存>中 ...

  4. JS 模块化- 05 ES Module & 4 大规范总结

    1 ES Module 规范 ES Module 是目前使用较多的模块化规范,在 Vue.React 中大量使用,大家应该非常熟悉.TypeScript 中的模块化与 ES 类似. 1.1 导出模块 ...

  5. P1399 [NOI2013] 快餐店 方法记录

    原题题面P1399 [NOI2013] 快餐店 题目描述 小 T 打算在城市 C 开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小 T 希望快餐店的地址选在离最 ...

  6. 华为路由器NAT基本配置命令

    NAT地址转换 静态 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]nat static global 202.169.10.5 inside 172.16.1.1 ...

  7. 在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库

    文章目录 1.导入相关的依赖 2.创建要保存的数据信息实体类 3 .编写对应的sql语句 4.使用spring 的 aop 技术切到自定义注解上,所以先创建一个自定义注解类 5. 创建aop切面实现类 ...

  8. Codeforces Round #816 (Div. 2)/CodeForces1715

    CodeForces1715 Crossmarket 解析: 题目大意 有一个 \(n \times m\) 的空间,Stanley 需要从左上角到右下角:Megan 则需要从左下角到右上角.两人可以 ...

  9. DQL-模糊查询

    DQL-模糊查询 模糊查询即模糊检索,是指搜索系统自动按照用户输入关键词的同义词进行模糊检索,从而得出较多的检索结果.与之相反的是"精准搜索".模糊检索也可以说是同义词检索,这里的 ...

  10. Java多线程-ThreadPool线程池-2(四)

    线程池是个神器,用得好会非常地方便.本来觉得线程池的构造器有些复杂,即使讲清楚了对今后的用处可能也不太大,因为有一些Java定义好的线程池可以直接使用.但是(凡事总有个但是),还是觉得讲一讲可能跟有助 ...