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 只作用于当前节点,要遍历全部键必须逐节点执行再合并结果。