687 字
3 分钟
Redis 的 SCAN 和 KEYS 有什么区别?
  1. 1Redis 系列导读:知识地图、必会主线与复习顺序
  2. 2Redis 中常见的数据类型有哪些?
  3. 3Redis 通常应用于哪些场景?
  4. 4Redis为什么这么快?
  5. 5Redis 常用的过期时间、删除 Key 命令有哪些?
  6. 6Redis 的过期 Key 是如何被删除的?
  7. 7Redis 内存满了怎么办?有哪些淘汰策略?
  8. 8缓存穿透、击穿、雪崩的区别与解决方案
  9. 9Redis 如何保证缓存与数据库的数据一致性?
  10. 10Redis 的持久化机制有哪些?
  11. 11Redis 主从复制的完整流程是什么?
  12. 12Redis 的哨兵机制是什么?
  13. 13Redis Cluster 模式与 Sentinel 模式的区别是什么?
  14. 14Redis 支持事务吗?如何实现?
  15. 15Redis 中如何实现分布式锁?
  16. 16Redis 的 Lua 脚本功能是什么?如何使用?
  17. 17如何解决 Redis 中的热点 Key 问题?
  18. 18Redis BigKey 有什么危害?如何发现和治理?
  19. 19为什么 Redis 设计为单线程?6.0 版本为何引入多线程?
  20. 20Redis 的 LRU 和 LFU 有什么区别?
  21. 21Redis 数据类型和底层编码有什么区别?
  22. 22Redis 中跳表的实现原理是什么?
  23. 23Redis 的 ZSet 为什么使用跳表,而不是平衡树?
  24. 24Redis 的 RDB 快照如何生成?为什么会有写时复制?
  25. 25Redis 的 AOF 刷盘和重写有什么区别?
  26. 26Redis 断线后如何通过 PSYNC 部分重同步?
  27. 27Redis 主从切换为什么会丢数据?WAIT 能解决吗?
  28. 28Redis 集群会出现脑裂问题吗?
  29. 29Redisson 看门狗(watch dog)机制了解吗?
  30. 30Redis Cluster:哈希槽、Gossip 与故障转移
  31. 31Redis Pipeline 为什么能提高吞吐?能保证原子性吗?
  32. 32Redis 的 SCAN 和 KEYS 有什么区别?本文
  33. 33Redis 变慢时如何排查?SLOWLOG 能看到所有耗时吗?
  34. 34Redis 和 MySQL 有什么区别?
  35. 35Redis 为什么使用 SDS,而不是 C 字符串?
  36. 36Redis 的哈希表如何处理冲突和渐进式 rehash?
  37. 37Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?
  38. 38Redis Cluster 为什么会报 CROSSSLOT?Hash Tag 怎么用?
  39. 39Redis 如何实现限流?固定窗口和滑动窗口怎么选?
  40. 40Redis Stream 如何保证消息消费?ACK 和 PEL 是什么?
  41. 41Redis 删除数据后为什么内存不下降?如何理解内存碎片?

KEYS 一次遍历匹配的键空间,数据量大时可能长时间占用主线程;SCAN 使用游标把遍历分摊到多次调用,降低单次长暂停风险。SCAN 不是稳定快照,也不是具有固定页大小的数据库分页。

游标怎么用?#

SCAN 0 MATCH user:* COUNT 100
# 使用返回的游标继续调用,直到返回游标 0

第一次传入 0,之后将返回游标原样传回。游标是扫描状态标记,不能按加一或页码计算;一次返回空结果但游标不为 0 时,也要继续。COUNT 是工作量提示,不保证刚好返回指定数量。MATCH 是模式过滤,也不等于构建了一份前缀索引;完整扫描的总工作仍会涉及键空间。

遍历有哪些保证?#

在一次完整迭代开始到结束期间始终存在的元素,完整扫描保证会返回;始终不存在的元素不会返回。扫描期间变化的元素是否返回不确定,而且同一个元素可能出现多次。因此清理、计费等任务必须去重或使操作幂等,不能把返回次数当成精确业务数量。

集合类型还有 HSCAN、SSCAN、ZSCAN。紧凑编码的较小容器可能一次返回大量甚至全部元素,COUNT 并不严格限制结果大小。持续增长的集合也可能让迭代难以结束,遍历任务应有时间与负载预算。

在 Redis Cluster 中,一次命令通常只扫描当前节点的键空间。要遍历整个集群,需要覆盖相关主节点;同时扩缩容和迁移可能造成重复或遗漏,需要把拓扑变化纳入任务设计。

常见追问#

SCAN 一定比 KEYS 总耗时少吗?#

不一定。它主要减少单次阻塞,把工作摊开,增加往返后总耗时可能更长;优势在对在线服务影响更可控。

MATCH user:* 会只扫描 user 开头的 Key 吗?#

不能通常这么理解。它过滤扫描结果,不是一般意义的前缀索引;某些版本与 Cluster 优化需单独核对。

如何安全清理一类缓存?#

使用完整游标迭代、小批次删除或 UNLINK,并限速;操作设计成幂等,接受扫描期间变化的边界,必要时采用业务版本号切换缓存命名空间。

能用 SCAN 给用户提供固定页码吗?#

不适合。它没有稳定排序与快照保证;需要固定分页时选择带有明确顺序和边界的数据结构或持久化查询。

Redis 的 SCAN 和 KEYS 有什么区别?
https://blog.xqcherry.top/posts/interview/redis/redis-scan-vs-keys/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0