怎样用Redis Scan命令代替Keys安全遍历特定数据类型的所有Key?

胖雪君_3005

胖雪君_3005

2026-10-24

910人浏览

原创

必须用scan替代keys,但scan无法按类型过滤,需配合type等命令二次判断,并处理游标、重复、中断续扫等问题。

怎样用redis scan命令代替keys安全遍历特定数据类型的所有key?

直接说结论:用 SCAN 替代 KEYS 是必须的,但仅靠 SCAN 本身无法按数据类型过滤;必须配合 TYPE 或 PTTL 等命令二次判断,且需处理游标、重复、中断续扫等现实问题。

为什么不能直接用 SCAN + MATCH 筛选数据类型?

SCAN 的 MATCH 参数只支持 glob 模式匹配 key 名(如 "user:*"),不感知 value 类型。Redis 没有内置类似 SCAN TYPE string 的语法。

  • 常见误操作:SCAN 0 MATCH "*" TYPE hash —— 这会报错 ERR syntax error,因为 TYPE 不是 SCAN 的合法参数
  • 真实限制:服务端不提供类型索引,所有类型判断必须在客户端发起额外请求
  • 后果:一次 SCAN 返回 100 个 key,你得发 100 次 TYPE 请求——网络开销和延迟陡增

安全遍历 string 类型 key 的最小可行方案

核心思路:分批 SCAN → 并行查 TYPE → 过滤出 "string" → 合并结果。注意控制并发和游标状态。

redis-tools
redis-tools

按类别查找Redis命令、检测服务器连接、监控键数量和内存占用,支持离线速查表。

下载
  • 用 COUNT 显式指定批次大小(如 SCAN 0 COUNT 50),避免默认 10 导致轮询次数过多
  • 每次收到新游标(cursor)后必须保存,下次从该值继续;游标为 "0" 表示遍历结束
  • 对每个返回的 key,用 pipeline 批量发 TYPE(例如 redis-py 的 pipeline().type(...).execute()),减少 RTT
  • 若某次 SCAN 返回空数组但游标非 "0",说明可能被其他客户端删除了部分 key,继续用当前游标重试

避免阻塞和漏扫的关键细节

SCAN 不阻塞,但不等于“绝对安全”——实际使用中容易踩三个坑:

  • 游标超时失效:某些 Redis 代理(如 Twemproxy)或云服务(如阿里云 Tair)会丢弃长时间未推进的游标,建议单次扫描耗时控制在 5 秒内
  • key 在扫描中被删:SCAN 可能跳过刚被 DEL 的 key,也可能重复返回刚被 SET 的 key,这是设计使然,无法避免
  • 没有原子性保证:你拿到一批 key 后再查 TYPE,期间 key 的 type 可能已被改写(比如 INCR 把 string 变成 number),所以结果只能视为“快照”
  • 生产环境务必加超时和重试:比如设置 SCAN 单次响应 >2s 就中断,记录当前游标,后续从该点恢复

真正省事但有代价的替代方案

如果业务允许少量延迟或额外存储,可以绕过实时遍历:

  • 写时记录:所有写入 string 类型 key 的地方,同步 SADD string_keys {key},读时用 SMEMBERS string_keys + SCAN 分页取
  • 用 RedisJSON 或 ReJSON 模块:它把结构化数据存为 JSON,可用 JSON.TYPE 查询字段类型,但仍是额外请求,且不解决基础类型遍历问题
  • 监控辅助:开启 CONFIG SET notify-keyspace-events KEA,监听 set 事件写入白名单,但无法回溯历史 key

最麻烦的地方不在命令怎么写,而在于你要自己维护游标状态、处理网络失败、接受结果非强一致——这些逻辑一旦漏掉一环,线上扫出来的 key 列表就不可信。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

redis

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.31

3051

5

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.31

554

9

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2026.02.12

522

19

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4589

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4155

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

7792

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

643

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

756

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

7802

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习