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
命令。