首页/数据/Redis 进阶速查/KEYS 的替代路径
性能与排障129 条

KEYS 的替代路径

KEYS 一次性扫描全键空间,生产环境应改用 SCAN 迭代或维护索引集合来按前缀取键。

Redis 进阶速查数据更新于 2026-10-13

KEYS 的替代路径

KEYS 会一次性遍历整个键空间,复杂度与键总数成正比,而且执行期间阻塞主线程,在键数较多的实例上足以造成秒级卡顿,因此生产环境应当避免。替代方案有三条:用 SCAN 游标迭代按模式分批扫描;用集合类结构自己维护键名索引,按业务维度登记键;或者由业务侧直接记录键清单。SCAN 只保证完整迭代能覆盖起止期间一直存在的元素,中途新增的键不保证出现,返回值也可能重复,要按弱一致性使用。

基本信息

危险命令KEYS pattern
迭代替代SCAN cursor MATCH pattern COUNT n
类型过滤较新版本 SCAN 支持 TYPE
游标含义0 表示迭代结束
索引替代用 set 维护键名清单,配合 SSCAN 遍历
一致性弱一致,可能重复且不保证包含新键
使用建议只读副本或低峰执行扫描

典型使用场景

  • 运维脚本需要按前缀找键,把 KEYS 改造成 SCAN 迭代
  • 排查大键前先定位候选键清单
  • 清理一批过期业务数据,按前缀分批扫描删除
  • 为高频查询维度建立键名索引,替代全量扫描
  • 审计键空间命名规范,抽样检查前缀分布
  • 在集群模式下按节点分别扫描,拼出完整视图

迭代与索引写法

迭代与索引写法
redis-cli --scan --pattern 'user:*' --count 100   # 基于 SCAN 的迭代输出
redis-cli SCAN 0 MATCH 'user:*' COUNT 100          # 手动迭代,返回新游标
redis-cli SCAN 0 MATCH 'user:*' COUNT 100 TYPE hash # 较新版本支持类型过滤
redis-cli SMEMBERS index:user:active               # 自己维护的键名索引
redis-cli SSCAN index:user:active 0 COUNT 100      # 索引本身大时也迭代
redis-cli DBSIZE && redis-cli INFO keyspace        # 先了解键空间规模

三种方案对照

方案开销适用
KEYS全量扫描且阻塞生产环境应避免
SCAN分批迭代,弱一致一次性排查与扫描
索引集合维护成本换查询效率高频按维度取键
SCAN 的 COUNT 只是每次迭代的建议数量,实际返回可能更多或更少,循环逻辑不要依赖固定条数。
集群模式下 SCAN 只作用于当前节点,要遍历全部键必须逐节点执行再合并结果。

易错点

  • 在线上直接执行 KEYS,主线程被阻塞导致成片请求超时
  • SCAN 的 COUNT 设得很大,单次迭代耗时上升,节奏失控
  • 误以为 SCAN 会返回期间所有新写入的键,弱一致性预期落空
  • 索引集合自身膨胀却没有配套清理,空间占用反超收益
  • 集群里只扫描一个节点就以为拿到了全量键清单

数据来源与参考

  • Redis 官方文档:SCAN 与 KEYS 对比
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌