699 字
3 分钟
Redis BigKey 有什么危害?如何发现和治理?
  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 删除数据后为什么内存不下降?如何理解内存碎片?

BigKey 指单个 Key 的 Value 很大或容器元素过多,HotKey 指访问特别频繁。二者可以同时发生,但并不等价。没有适合所有业务的固定字节阈值,应结合单次访问延迟、网络带宽、内存成本和命令复杂度判断。

主要风险在哪里?#

大 String 读取需要复制、序列化与传输大量字节;巨大 Hash/List/Set/ZSet 做全量遍历、复杂操作或删除时,可能长时间占用执行线程。复制、迁移和持久化也要处理大对象,带来缓冲增长、迁移抖动或内存峰值。Cluster 把一个 Key 放在一个槽位,增加节点并不会自动拆分这个 Value。

例如把所有用户放进一个 Hash,每次 HGETALL 获取全部数据,即使 Redis 使用哈希表,也需要遍历和返回整个容器。平均 O(1) 的单字段访问不能证明 HGETALL 也很快。

如何发现?#

可以用 redis-cli --bigkeys 辅助扫描,并结合 STRLEN、HLEN、LLEN、SCARD、ZCARD 判断规模,用 MEMORY USAGE 估算内存。工具对不同类型的计量方式不同,元素数不等于字节数;采样与扫描也会增加实例负载,生产环境应限速、避开高峰,并遍历 Cluster 的各个相关节点。

如何治理?#

按业务维度拆分容器,限制单对象大小,避免全量返回,使用分页或增量访问。拆分同时要考虑原子性、查询次数和热点分布,不能为了“每个 Key 小”把一次操作变成几万次网络请求。

删除大对象可考虑 UNLINK,或按类型分批移除元素;逻辑删除后再异步清理也可减少请求等待。操作前检查来源和业务影响,控制清理速度,避免删除与缓存重建同时把数据库压满。

常见追问#

BigKey 一定是 HotKey 吗?#

不是。很大的冷数据也会增加内存和持久化成本;很小的热门计数器也能压满单节点 CPU。

不能。它减少某些释放工作对主线程的影响,但后台释放仍耗 CPU 和内存;其他大对象读取、复制和迁移成本仍存在。

给 BigKey 加 TTL 就安全了吗?#

不是。到期前的操作仍有风险,到期删除与集中重建也可能造成抖动;需要从数据建模和访问模式治理。

为什么集合扫描不能当精确分页?#

SCAN 家族不提供稳定快照,变更期间可能出现重复或不确定结果。业务需要稳定页码和一致结果时,应采用有明确排序与边界的数据模型。

Redis BigKey 有什么危害?如何发现和治理?
https://blog.xqcherry.top/posts/interview/redis/redis-bigkey-detection/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0