Redis 热 key 与大 key 治理
一句话热 key 的问题是“访问太集中”会打爆单个 Redis 节点大 key 的问题是“value 太大”会占内存、占带宽并阻塞 Redis 主线程。热 key 重点是分散流量大 key 重点是拆分和避免全量操作。1. 热 key 和大 key 的区别类型核心问题典型表现治理方向热 key访问频率太高单个 key QPS 极高打满某个节点分散流量、本地缓存、逻辑过期大 keyvalue 体积太大读写慢、删除慢、网络传输大拆分、分页、异步删除不要把热 key 和大 key 混在一起热 key 可以很小比如一个活动配置 String但被每秒请求 10 万次。 大 key 不一定很热比如一个巨大 Hash 很少访问但一访问就阻塞 Redis。2. 什么是热 key热 key 是访问频率特别高的 key。典型场景秒杀商品库存stock:sku:1001 首页配置home:config 考试规则exam:rule:2026 排行榜rank:today 热点文章详情article:hot:1001热 key 的危害① 单点压力过高 Redis Cluster 中同一个 key 只落在一个分片 热 key 会把某个分片打满 ② 引发缓存击穿 热 key 一旦过期大量请求同时打到 DB ③ 网络和 CPU 压力集中 即使 value 很小超高 QPS 也会打满网络或 Redis 主线程3. 热 key 怎么处理方案一本地缓存应用本地用 Caffeine 缓存热点数据 请求先查本地缓存 本地未命中再查 Redis Redis 未命中再查 DB适合读多写少、允许短暂最终一致的数据比如配置、规则、字典、榜单。方案二热 key 拆分原 keyhot:product:1001 拆分为 hot:product:1001:1 hot:product:1001:2 hot:product:1001:3 hot:product:1001:4 读请求随机访问一个副本这样可以把一个 key 的访问压力分散到多个 Redis key甚至分散到不同分片。方案三逻辑过期或永不过期热点 key 不设置物理 TTL value 中带 expireTime 读请求发现逻辑过期后异步刷新缓存 刷新期间仍返回旧值适合高可用优先、允许短时间旧数据的场景。方案四热 key 探测通过监控统计 key 访问频率 发现热点 key 后自动加入本地缓存或做副本拆分4. 什么是大 key大 key 是单个 key 对应的 value 特别大。典型例子Stringvalue 几 MB 甚至几十 MB Hash几十万个 field List几十万、几百万个元素 Set / ZSet元素数量巨大大 key 不只看内存大小也看操作复杂度。一个 Hash 总大小可能不夸张但HGETALL一次拉几十万个 field也会产生阻塞。5. 大 key 的危害① 占用内存 单个 key 过大内存分布不均 ② 网络传输量大 一次读取返回几 MB 数据拖慢接口 ③ 阻塞 Redis 主线程 Redis 核心命令执行是单线程 HGETALL / LRANGE 0 -1 / SMEMBERS 大 key 会长时间占用主线程 ④ 删除阻塞 DEL 大 key 可能同步释放大量内存造成卡顿 ⑤ Cluster 迁移慢 扩容、reshard、主从同步时大 key 会拖慢数据迁移6. 大 key 怎么处理方案一拆分大 key大 Hashuser:all 拆成 user:part:0 user:part:1 user:part:2 大 Listmessage:list 按用户、时间、业务维度拆分原则是让单个 key 的 value 尽量可控。方案二分页 / 分批读取避免这些全量命令HGETALL huge_hash LRANGE huge_list 0 -1 SMEMBERS huge_set ZRANGE huge_zset 0 -1改成HSCAN SSCAN ZSCAN LRANGE start end 分页读取方案三UNLINK 替代 DELUNLINK big:keyUNLINK会把 key 从键空间中移除并把内存释放交给后台线程处理减少主线程阻塞。方案四定期扫描和监控redis-cli--bigkeys也可以结合监控系统统计 key 大小、命令耗时、慢查询日志提前发现风险。7. 项目表达考试系统热点配置考试高峰期考试规则、试卷配置、用户考试状态这类数据会被频繁读取。 其中规则和配置属于典型热 key但数据量不大适合用 Redis Caffeine 二级缓存。 Caffeine 承担本地热点读减少 Redis 网络请求Redis 保证多实例共享。 写入配置时先更新 DB再删除 Redis并通知各节点清理本地缓存。 如果通知失败本地缓存也有短 TTL 兜底保证最终一致。 对于题目列表这类可能比较大的数据不会用一个大 key 全量缓存 而是按考试、题型、分页维度拆开避免 HGETALL 或一次性读取超大 value。8. 面试高频追问热 key 一定要拆分吗不一定。读多写少的小 value优先本地缓存就能解决大部分压力。 只有本地缓存不适合或者 Redis 单分片压力仍然很高时才考虑副本拆分。大 key 为什么会阻塞 RedisRedis 命令执行主流程是单线程。 一个大 key 的全量读取、遍历或删除命令执行时间长 期间其他命令只能等待所以会造成整体响应抖动。DEL 和 UNLINK 有什么区别DEL 是同步删除释放内存可能阻塞主线程。 UNLINK 是异步删除先把 key 从键空间移除再由后台线程释放内存 更适合删除大 key。面试回答模板“热 key 和大 key 是两个不同问题。热 key 是访问频率特别高比如秒杀库存、 首页配置、考试规则会把某个 Redis 节点或分片打满也可能在过期时引发 缓存击穿。处理方式包括 Caffeine 本地缓存、热点 key 拆成多个副本、 逻辑过期或永不过期以及热 key 监控探测。 大 key 是单个 value 特别大比如几 MB 的 String或者几十万个 field 的 Hash。 它的危害是占内存、占带宽HGETALL、SMEMBERS、LRANGE 0 -1 这类全量操作 会阻塞 Redis 主线程DEL 大 key 也可能造成卡顿。处理方式是拆分 key 分页或分批读取用 HSCAN、SSCAN 代替全量命令删除时用 UNLINK 替代 DEL 并通过 redis-cli --bigkeys 或监控系统定期巡检。”参考来源Day10-缓存与分布式锁Redis 为什么快Redis 官方文档Redis latency problems troubleshooting