ZBLOG

在redis想要查询所有的keys的时候,为什么scan一个个出结果可以更快。工作量不是没变的么。是为了防止别的线程的请求等待太久么

是的,你的理解基本正确。SCAN 命令在 Redis 中用于逐步迭代所有键(keys),而不是像 KEYS * 命令那样一次性返回所有结果。虽然总工作量(遍历所有键)没有减少,但 SCAN 的设计主要是为了解决以下问题:


1. 避免阻塞其他请求

  • KEYS * 命令会一次性遍历整个键空间(尤其是数据量大的时候),阻塞 Redis 主线程,导致期间其他客户端请求无法被处理(Redis 是单线程模型)。
  • SCAN 通过分批次返回结果(每次只返回少量键),将遍历任务拆分成多个小操作,每批操作之间允许处理其他客户端的请求,从而避免长时间阻塞。

2. 减少客户端等待时间

  • 如果直接使用 KEYS *,客户端需要等待所有键遍历完成后才能收到响应(可能耗时秒级甚至分钟级)。
  • SCAN 分批返回,客户端可以逐步接收部分结果,无需等待全部完成(例如先显示部分数据给用户)。

3. 应对大数据量的场景

  • 当 Redis 实例中存在数百万甚至更多键时,KEYS * 可能耗尽服务器内存或网络带宽(返回超大响应)。
  • SCAN 通过游标(cursor)迭代,每次只返回有限数量的键(默认约 10-100 个),控制内存和网络开销

4. 允许中途终止

  • SCAN 的游标机制允许客户端在任意批次后停止迭代(例如用户取消操作),而 KEYS * 一旦执行无法中断。

⚠️ 注意:

  • SCAN 命令在执行过程中可能遇到重复或遗漏的键(因为迭代期间数据可能被修改),但官方保证最终能遍历完所有键。
  • 如果需要精确一致性,可以在迭代期间使用 SSCANHSCANZSCAN 等针对特定数据结构的命令。

总结:

特性 KEYS * SCAN
阻塞性 完全阻塞主线程 非阻塞(分批执行)
适用场景 调试或小数据量环境 生产环境大数据量
内存/网络开销 可能极大(一次性返回) 可控(分批返回)
一致性 返回执行瞬间的快照 可能包含重复或遗漏(弱一致性)

因此,尽管总工作量不变,但 SCAN 通过分批次处理优化了响应性和系统稳定性。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24154

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?