Redis如何从海量key中查询出某一固定前缀的key

 更新时间:2025年07月16日 08:52:20   作者:一缕纯氧  
当Redis存储一亿key时,使用keys指令可能因返回全部key导致服务器卡顿,而scan指令通过游标分批获取,避免阻塞,适合生产环境,需注意重复结果可用hashSet去重,count参数可调整返回数量但非强制

常问问题

假如redis里有一亿个key,其中有10万个key是以某个固定的已知的前缀开头的,如何将他们全部找出来?

留意细节

摸清数据规模(数据量是多大?根据实际场景去作答),问清楚边界。

给出答案

1.用keys指令找出指定模式的key列表

  • 缺点:一次性需要返回所有的key,如果可以的数量过大,会使服务器卡顿,对于内存的消耗和redis服务器都是隐患。

2.用scan指令

  • 无阻塞地提取出指定前缀的key列表,scan每次执行都只会返回少量元素,所以可以用于生产环境,不会出现像keys命令带来的可能会阻塞服务器问题。

SCAN cursor [MATCH pattern] [COUNT count]

1.scan指令是一个基于游标的迭代器

命令每次被调用都需要上一次调用返回的游标作为该次调用的游标参数(cursor),以此来延续之前的迭代过程。

2.当scan指令的游标参数cursor设置为0时

  • 服务器将开始一次新的迭代,而当服务器向用户返回值为0的游标时,就表示迭代已经结束。
  • 0作为游标开始新一次的迭代,一直调用游标指令直到游标返回0,我们称这个过程为一次完整的遍历。

3.scan增量式迭代

  • 并不保证每次执行都会返回某个给定数量的元素,甚至可能会返回0个元素,但只要命令返回的游标不是0,应用程序就不应该将程序视为结束。
  • 命令返回的元素数量总是符合一定规则的,对于一个大数据集来说,增量式迭代命令每次最多可能会返回数十个元素,而对于一个足够小的数据级来说,可能会一次迭代返回所有的key。
  • 类似于keys指令,scan可以通过给定match参数的方式,传入要查找键位的模糊匹配方式,让命令只返回和给定的模式相匹配的元素。

4.对于增量式迭代命令

  • 是没有办法保证每次迭代所返回的元素数量的,可以使用count选项,对命令的行为进行一定程度上的调整
  • count选项的作用,就是让用户告知迭代命令,在每次迭代中应该从数据集里返回多少元素。
  • 使用count选项对于增量式迭代命令相当于是一种提示,大多数情况下这种提示都是比较有效的控制了返回的数量的,但count选项并不能严格地控制返回的数量,只能是一个大致的约束,并非每次迭代都会返回count数量的元素,用户可以在每次迭代根据自己的需要随意改变count值,只要将上次迭代返回的游标用在下次迭代即可。
127.0.0.1:6379> scan 0 match k1* count 10
1) "11009983"
2) 1) "k15183267"
   2) "k18983203"
   3) "k14348902"
127.0.0.1:6379> scan 11009983 match k1* count 10
1)"23902345"
2) 1) "k17203743"
   2) "k18324732"
   3) "k11028343"
   4) "k11143424"
   5) "k12304823"
127.0.0.1:6379> scan 23902345 match k1* count 10
1) "24080390"
2) 1) "k12438294"
   2) "k18392744"
   3) "k14320420"
   4) "k11043243"

使用SCAN指令获取到的结果可能会重复,后端可以用hashSet收集结果,以达到去重的效果。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 安装redis(windows和Ubuntu)详解

    安装redis(windows和Ubuntu)详解

    这篇文章主要介绍了Redis在Ubuntu和Windows下的安装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • springboot整合使用云服务器上的Redis方法

    springboot整合使用云服务器上的Redis方法

    这篇文章主要介绍了springboot整合使用云服务器上的Redis,整合步骤通过导入依赖,配置yml文件,注入redisTemplate结合实例代码给大家介绍的非常详细,文中给大家分享了可能遇到的坑,感兴趣的朋友跟随小编一起看看吧
    2022-09-09
  • Redis实现用户签到的示例代码

    Redis实现用户签到的示例代码

    Redis的位图可以高效实现用户签到功能,每个bit位对应一个签到状态,节省存储空间,利用SETBIT、GETBIT等命令操作签到数据,可统计连续签到天数和本月签到情况,感兴趣的可以了解一下
    2024-09-09
  • 解析高可用Redis服务架构分析与搭建方案

    解析高可用Redis服务架构分析与搭建方案

    我们按照由简至繁的步骤,搭建一个最小型的高可用的Redis服务。 本文通过四种方案给大家介绍包含每种方案的优缺点及详细解说,具体内容详情跟随小编一起看看吧
    2021-06-06
  • React中immutable的使用

    React中immutable的使用

    这篇文章主要介绍了React中immutable的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Redis列表类型的常用命令小结

    Redis列表类型的常用命令小结

    这篇文章给大家整理了在操作Redis列表类型中的常用命令,文章总结的很全面,对大家学习Redis具有一定的参考借鉴价值,下面来一起看看吧。
    2016-09-09
  • Redis分布式锁解决秒杀超卖问题

    Redis分布式锁解决秒杀超卖问题

    本文主要介绍了Redis分布式锁解决秒杀超卖问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Redis中的String类型及使用Redis解决订单秒杀超卖问题

    Redis中的String类型及使用Redis解决订单秒杀超卖问题

    这篇文章主要介绍了Redis中的String类型及使用Redis解决订单秒杀超卖问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • ELK配置转存redis缓存采集nginx访问日志的操作方法

    ELK配置转存redis缓存采集nginx访问日志的操作方法

    本文介绍了在服务器上部署MySQL及如何启动MySQL服务,并详细说明了如何查找安装软件的日志文件位置,通过使用rpm命令查询MySQL服务的日志文件位置,以及通过编辑Logstash配置文件来添加MySQL日志信息,感兴趣的朋友一起看看吧
    2024-11-11
  • Redis过期键与内存淘汰策略深入分析讲解

    Redis过期键与内存淘汰策略深入分析讲解

    因为redis数据是基于内存的,然而内存是非常宝贵的资源,然后我们就会对一些不常用或者只用一次的数据进行存活时间设置,这样才能提高内存的使用效率,下面这篇文章主要给大家介绍了关于Redis中过期键与内存淘汰策略,需要的朋友可以参考下
    2022-11-11

最新评论