SCAN 命令相比 KEYS * 有以下关键优势:
- SCAN 通过游标分批次返回数据,不会长时间阻塞Redis服务
- KEYS * 会一次性返回所有匹配键,大数据量时可能导致服务卡顿
- SCAN 可以在生产环境安全使用,不会引发性能问题
- KEYS * 可能引发生产事故(已被许多公司禁止使用)
- 每次调用返回部分结果和新的游标,客户端可以:
bash
SCAN 0 MATCH user:* COUNT 100
- 适合需要渐进式处理的场景
- 通过COUNT参数控制每次返回数量(但只是建议值)
- 示例:SCAN 0 COUNT 500 尝试每次返回约500个元素
- 虽然不保证实时一致性(遍历期间可能有修改) - 但保证完整遍历所有存在的键(不会遗漏)
- 同样支持模式匹配,但更安全:
bash
SCAN 0 MATCH product:123*
- 在Redis集群中可以直接使用
- KEYS * 在集群中只能针对单个节点操作
典型使用场景对比:
- 开发调试:可以用KEYS *快速查看
- 生产环境:必须使用SCAN + 脚本处理:
python
cursor = 0
while True:
cursor, keys = r.scan(cursor, match='user:*')
process_keys(keys)
if cursor == 0:
break
注意事项:
1. SCAN 可能返回重复键,需要客户端去重
2. 遍历期间的数据修改可能被包含/不包含在结果中
3. 对于大集合,COUNT值需要根据实际测试调整
建议所有生产环境代码都用SCAN替代KEYS命令。