插件窝 干货文章 scan 命令相比 keys * 有什么优势

scan 命令相比 keys * 有什么优势

SCAN 遍历 KEYS 返回 775    来源:    2025-03-29

SCAN 命令相比 KEYS * 有以下关键优势:

  1. 非阻塞式迭代

- SCAN 通过游标分批次返回数据,不会长时间阻塞Redis服务 - KEYS * 会一次性返回所有匹配键,大数据量时可能导致服务卡顿

  1. 生产环境安全

- SCAN 可以在生产环境安全使用,不会引发性能问题 - KEYS * 可能引发生产事故(已被许多公司禁止使用)

  1. 增量式处理

- 每次调用返回部分结果和新的游标,客户端可以: bash SCAN 0 MATCH user:* COUNT 100 - 适合需要渐进式处理的场景

  1. 可控的遍历量

- 通过COUNT参数控制每次返回数量(但只是建议值) - 示例:SCAN 0 COUNT 500 尝试每次返回约500个元素

  1. 一致性保证

- 虽然不保证实时一致性(遍历期间可能有修改) - 但保证完整遍历所有存在的键(不会遗漏)

  1. 模式匹配支持

- 同样支持模式匹配,但更安全: bash SCAN 0 MATCH product:123*

  1. 集群支持

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