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介绍与使用一文搞懂

    Redis介绍与使用一文搞懂

    文章主要介绍了Redis的基本概念、应用场景、数据模型、内存存储机制、高性能特点、安装与配置、常用命令、持久化与备份、高级特性等内容,感兴趣的朋友跟随小编一起看看吧
    2026-05-05
  • 使用Redis控制表单重复提交和控制接口访问频率方式

    使用Redis控制表单重复提交和控制接口访问频率方式

    这篇文章主要介绍了使用Redis控制表单重复提交和控制接口访问频率方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • Redis中Zset类型常用命令的实现

    Redis中Zset类型常用命令的实现

    Zset是Redis的一种有序集合数据类型,Zset通过压缩列表和跳跃表两种底层编码方式支持小数据集和大数据集,支持多种操作,包括添加、查询、删除元素以及集合运算等,具有不同的时间复杂度,感兴趣的可以了解一下
    2024-10-10
  • React Antd Cascader组件地区选择方式

    React Antd Cascader组件地区选择方式

    文章介绍了在表单中实现地区选择功能,使用Cascader组件动态加载数据,需通过loadData和递归处理实现增删改查,存储和回显需完整id数组以支持多级地区展示,强调后端设计对数据关联(id/pid)的重要性
    2025-08-08
  • Redis五大基本数据类型及对应使用场景总结

    Redis五大基本数据类型及对应使用场景总结

    Redis有五种基本数据类型,分别是字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),这些基本数据类型使得Redis具备了丰富的数据结构和功能,适用于各种不同的应用场景,本文就给大家详细的介绍一下这五大类型
    2023-08-08
  • Redis存储的列表分页和检索的实现方法

    Redis存储的列表分页和检索的实现方法

    在 Redis 中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,以下是 Redis 列表的分页和检索的实现方法,需要的朋友可以参考下
    2025-02-02
  • Redis实现未读消息计数的示例代码

    Redis实现未读消息计数的示例代码

    本文介绍了合伙人系统中产品分配流程及其未读计数的实现方案,通过Redis工具类,实现了未读计数的新增、查询和重置功能,感兴趣的可以了解一下
    2025-12-12
  • redis主从复制原理的深入讲解

    redis主从复制原理的深入讲解

    这篇文章主要给大家介绍了关于redis主从复制原理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • Redis中哨兵机制和集群的区别及说明

    Redis中哨兵机制和集群的区别及说明

    Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根据数据量和扩展需求选择
    2025-08-08
  • SpringBoot 开启Redis缓存及使用方法

    SpringBoot 开启Redis缓存及使用方法

    用redis做缓存,是因为redis有着很优秀的读写能力,在集群下可以保证数据的高可用,那么今天通过本文给大家讲解下SpringBoot使用Redis的缓存的方法,感兴趣的朋友一起看看吧
    2021-08-08

最新评论