在redis实际使用中,会遇到一个问题:如何从海量的key中找出满足特定前缀的key列表?

1.不要使用keys*

redis提供了一个简单包里的指令keys用来列出所有满足特定正则字符串规则的key。

keys xxx*

这个指令有致命的弊端,在实际环境中最好不要使用:

这个指令没有offset、limit参数,是要一次性吐出所有满足条件的key,由于redis是单线程的,其所有操作都是原子的,而 keys 算法是遍历算法,复杂度是 O(n),如果实例中有千万级以上的 key,这个指令就会导致 Redis 服务卡顿,所有读写 Redis 的其它的指令都会被延后甚至会超时报错,可能会引起缓存雪崩甚至数据库宕机。

我们可以通过配置设置禁用这些命令,在 redis.conf 中,在 SECURITY 这一项中,我们新增以下命令:

rename-command flushall ""
rename-command flushdb ""
rename-command config ""
rename-command keys ""

另外,对于FLUSHALL命令,需要设置配置文件中appendonly no,否则服务器是无法启动。

Redis 为了解决这个问题,它在 2.8 版本中加入了scan。scan 相比 keys 具备有以下特点:

  • 复杂度虽然也是 O(n),但是它是通过游标分步进行的,不会阻塞线程;
  • 提供 limit 参数,可以控制每次返回结果的最大条数,limit 只是一个 hint,返回的结果可多可少;
  • 同 keys 一样,它也提供模式匹配功能;
  • 服务器不需要为游标保存状态,游标的唯一状态就是 scan 返回给客户端的游标整数;
  • 返回的结果可能会有重复,需要客户端去重复,这点非常重要;
  • 遍历的过程中如果有数据修改,改动后的数据能不能遍历到是不确定的;
  • 单次返回的结果是空的并不意味着遍历结束,而要看返回的游标值是否为零;

2.scan使用

SCAN 命令及其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用于增量地迭代:

SCAN命令用于迭代当前数据库中的数据库键。

SSCAN命令用于迭代集合键中的元素。

HSCAN命令用于迭代哈希键中的键值对。

ZSCAN命令用于迭代有序集合中的元素(包括元素成员和元素分值)

相比于keys命令,SCAN命令有两个比较明显的优势:

1)SCAN命令的时间复杂度虽然也是O(N),但它是分次进行的,不会阻塞线程。

2)SCAN命令提供了count参数,可以控制每次遍历的集合数。

可以理解为SCAN是渐进式的keys

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

SCAN命令是基于游标的,每次调用后,都会返回一个游标,用于下一次迭代。

第一次 Scan 时指定游标为 0,表示开启新的一轮迭代,然后 Scan 命令返回一个新的游标,作为第二次 Scan 时的游标值继续迭代,一直到 Scan 返回游标为0,表示本轮迭代结束。

Scan完成一次迭代,需要和redis进行多次交互。

3.scan参数

Scan 命令中的 Count 指定一次扫描多少 Key,这里指定为 1000,几百万Key就需要几千次迭代,即和 Redis 交互几千次,然后因为是远程连接,网络延迟比较大,所以耗时特别长。

将 Count 参数调大后,减少了交互次数,会好很多。Count 参数越大,Redis 阻塞时间也会越长,需要取舍。

redis使用scan模糊匹配key相关推荐

  1. Redis遍历、模糊匹配key的两个命令keys、scan(python使用Redis)

    Redis遍历.模糊匹配key的两个命令keys.scan(python使用Redis) (1)全量遍历–keys命令 获取Redis中的所有键: import redis pool=redis.Co ...

  2. Redis Redis Cluster 字段模糊匹配及删除

    Questions 在数据库内我们可以通过like关键字.%.*或者REGEX关键字进行模糊匹配.而在Redis内我们如何进行模糊匹配呢?集群情况Redis Cluster的情况是否和单机一致呢?前段 ...

  3. redis的游标和模糊查询key的不适用

    项目场景: 提示:这里简述项目相关背景: 例如:项目场景:查平台的支付方式 问题描述 用来redis的scan模糊匹配的方式,查询key,在redis的key大于百万级的key的时候,会导致查询非常缓 ...

  4. redis能模糊删除key吗_redis 模糊匹配和批量删除

    keys 模糊匹配 可用版本: >= 1.0.0 时间复杂度: O(N), N 为数据库中 key 的数量. 查找所有符合给定模式 pattern 的 key , 比如说: KEYS * 匹配数 ...

  5. Redis模糊匹配并删除Key

    文章目录 1. 登录可以连接Redis的机器,安装Redis 2. 执行以下命令,删除模糊匹配到的Key 3. 案例 1. 登录可以连接Redis的机器,安装Redis 详情请参见redis-cli连 ...

  6. 关于redis模糊匹配的问题

    关于redis模糊匹配的问题 前言: 由于涉及到了模糊匹配,怕存在工作中的误导倾向,在此特定说明,线上代码一定不能使用keys去做模糊匹配,最好是用match,具体原因请自行百度 背景: # 一次设置 ...

  7. 增强Spring @CacheEvict实现key模糊匹配清除

    系统中集成了Spring cache 使用@CacheEvict进行缓存清除,@CacheEvict可以清除指定的key,同时可以指定allEntries = true清空namespace下的所有元 ...

  8. redis 用scan 代替keys 解决百万数据模糊查询超时问题

    redis 用scan 代替keys 解决百万数据模糊查询超时问题 参考文章: (1)redis 用scan 代替keys 解决百万数据模糊查询超时问题 (2)https://www.cnblogs. ...

  9. redis通过key模糊搜索_jedis模糊查询key

    jedis模糊查询key 2018-11-26 redis里面存的key是byte[]类型,怎么使用jedis进行key的模糊查询 在redis里面存储了一些数据,key和value都是byte[]类 ...

最新文章

  1. 2022-2028年中国能源期货市场深度调研及投资前景预测报告
  2. 【转】C语言的memset函数
  3. 在DB中存储图像-是或否?
  4. NLP:自然语言处理技术近十年发展技术更迭的简介、案例之详细攻略(持续更新)
  5. 如何简单的在 ASP.NET Core 中集成 JWT 认证?
  6. 『 效率工具 』Spring Boot版的轻量级代码生成器,减少70%以上的开发任务
  7. java字节码反编译_javap 反编译 java 字节码文件
  8. 机器学习理论知识部分--偏差方差平衡(bias-variance tradeoff)
  9. 面对未来的 Java,旧式桌面应用的出路何在?
  10. [译]JavaScript中的属性:定义和赋值的区别
  11. SiteMesh JSP布局框架介绍
  12. 【Gbase】给字段创建hash索引
  13. NP实验-1 华为MSTP+VRRP练习题
  14. windows11 美化桌面图标后报错
  15. 【大数据】大数据技术框架,有这一篇文章就够了
  16. 大数据和人工智能未来发展趋势
  17. C语言-出生日期输入输出
  18. 【面试】面试反问环节
  19. JAVA中传值与“传引用“辨析
  20. 为什么现在流行resultful,webservice无人问津?

热门文章

  1. 科技型小微企业研发费用补助资金申报解答,20万补助
  2. adb shell下载网络图片_Android:adb的screencap命令实现屏幕截图并保存
  3. 买不到的魅族:备货难产还是饥饿营销?
  4. win7怎么关闭3D加速的方法
  5. 中国首款7nm座舱芯片发布 2022年率先在吉利旗下车型量产上车
  6. Halcon:药品液位高度检测
  7. Linux qq掉线解决方案
  8. word页码从指定页开始,具体设置步骤
  9. Mysql还原数据库
  10. GreenDao的使用以及断点续传