发布时间:2026/9/6 11:37:35
Redis 应用实战(3):热 key 与大 key 治理 上一篇通过 TTL 抖动与请求合并压住集中回源但缓存内部仍可能严重倾斜。本篇把两个常被混称的问题拆开热 key 是访问频率异常大 key 是单个 value 或集合规模异常。前者消耗执行与网络吞吐后者放大传输、复制、持久化和释放成本只有分别测量治理动作才不会南辕北辙。一、痛点平均值会隐藏最危险的 key热 key 指访问频率显著高于其他 key不一定占很多内存大 key 指 value 或集合元素过大不一定经常访问。一个 20 字节的秒杀开关可能每秒读取十万次是热 key一个含百万成员但每天读取一次的 Set 是大 key。若只看实例平均 CPU、平均延迟和总内存就会错过局部倾斜。热 key 会集中在 Redis 单线程命令执行路径并在 Cluster 中集中到一个分片。副本分担读能缓解只读流量但带来复制延迟和一致性取舍。大 key 的GET虽是 O(1)返回几十 MB 仍会阻塞网络与客户端解析HGETALL、SMEMBERS、LRANGE 0 -1的成本与元素数相关。同步DEL巨型对象还可能在释放内存时卡住事件循环。二、发现从实例信号下钻到对象先看INFO commandstats、INFO stats、延迟和网络吞吐判断是命令计算、输出缓冲还是内存压力。SLOWLOG只记录服务器执行阶段不包含网络传输因此客户端很慢而慢日志为空并不矛盾。redis-cli --hotkeys依赖 LFU 相关计数适合辅助采样不应当作精确全量榜单应用侧按规范化 key 前缀统计请求频率通常更可靠。大 key 可用redis-cli --bigkeys做采样扫描它按类型报告“最大元素数”等信息并非所有类型都直接按字节比较。对候选 key 再用MEMORY USAGE key SAMPLES n、STRLEN、HLEN、LLEN、SCARD、ZCARD核实。扫描也会消耗资源应在副本或低峰进行设置节奏避免把诊断变成事故。下面程序按访问计数的中位数检测热点并按估算字节识别大对象。生产阈值应按实例容量和 SLO 校准示例强调两张榜单不能混为一谈。fromstatisticsimportmedian samples{config:flash-sale:{qps:12000,bytes:32},user:42:{qps:80,bytes:2048},catalog:all:{qps:20,bytes:8_500_000},user:43:{qps:70,bytes:1900},product:9:{qps:90,bytes:1200},}baselinemedian(item[qps]foriteminsamples.values())hot_thresholdbaseline*20large_threshold1_000_000hotsorted((keyforkey,valueinsamples.items()ifvalue[qps]hot_threshold),keylambdakey:samples[key][qps],reverseTrue,)largesorted((keyforkey,valueinsamples.items()ifvalue[bytes]large_threshold),keylambdakey:samples[key][bytes],reverseTrue,)print(fbaseline_qps{baseline})print(fhot_keys{hot})print(flarge_keys{large})print(foverlap{sorted(set(hot)set(large))})运行输出baseline_qps80 hot_keys[config:flash-sale] large_keys[catalog:all] overlap[]三、治理拆分、复制、限界和渐进删除热读数据可放应用进程本地缓存使用很短 TTL 或版本通知收敛这样请求不再全部穿过网络。允许轻微陈旧时可将同一值复制到多个带后缀的 key由客户端随机读取以分散 Cluster 槽位但更新必须写全副本并容忍短暂不一致。热写计数器可按时间或随机桶分片读取时汇总这把写压力换成读放大只适合可合并数据。大 String 应按业务边界拆分不要机械切字节导致每次读取仍需全量拼接。大 Hash/Set/Sorted Set 可按用户、月份或哈希桶拆 key并提供分页 API。集合遍历使用HSCAN、SSCAN、ZSCAN接受游标期间元素变化和可能重复SCAN 不是快照。列表或日志必须设置上限、归档周期和生产者背压。下面脚本创建一个受控测试 Hash用游标分批扫描然后以UNLINK异步释放。它不在共享命名空间运行也不会扫描整个数据库。#!/usr/bin/env bashset-euopipefailredis_url${REDIS_URL:-redis://127.0.0.1:6379/0}keydemo:bigkey:usersredis-cli-u$redis_urlDEL$key/dev/nullforstartin0100200300;doargs()for((istart;istart100;i));doargs(user:$iscore:$((i%17)))doneredis-cli-u$redis_urlHSET$key${args[]}/dev/nulldonecount$(redis-cli-u$redis_url--rawHLEN$key)cursor0seen0while:;domapfile-treply(redis-cli-u$redis_url--rawHSCAN$key$cursorCOUNT80)cursor${reply[0]}seen$((seen(${#reply[]}-1)/2))[[$cursor0]]breakdoneprintfhash_fields%s\n$countprintfscanned_fields%s\n$seenprintfunlinked%s\n$(redis-cli-u$redis_url--rawUNLINK$key)四、迁移治理动作本身也要限流拆 key 不能一次切换。先让写路径双写旧、新结构后台按游标回填历史数据读取路径优先新结构缺失时回退旧结构并补写核对数量、校验和与业务抽样后停止旧写最后等待回滚窗口再UNLINK。双写不是事务必须幂等并记录失败。Cluster 跨槽双写还不能依赖普通事务保证原子。随机过期旧 key或一次性删除大量 key都可能制造内存与回源尖峰。设置每秒迁移条数和字节预算观察used_memory、事件循环延迟、复制积压与副本 lag。若副本追不上继续迁移只会扩大故障域。生产者写入无界集合时治理重点不是定期清理而是把容量上限写进数据模型。热 key 的本地缓存也有代价进程越多总内存越大失效广播越复杂。极高价值且很小的配置适合这种方式用户权限等敏感数据必须用短 TTL、版本校验不能让撤权长期不生效。复制热点 key 时避免使用哈希标签把副本又固定到同一 Cluster 槽。五、验证建立按前缀的容量与热度预算每类 key 应有 owner、预计数量、单项大小、最大基数、TTL、读写 QPS 和删除方式。监控按业务前缀聚合而不是把完整用户 ID 作为指标标签造成高基数。报警后保留候选 key、命令、客户端和时间窗口才能复盘流量来源。压测要同时模拟请求分布和 value 大小。均匀随机流量无法复现热点只有小 value 的基准也看不到网络阻塞。观察 p99/p999、Redis CPU、网卡、客户端连接池等待和复制延迟。治理后若实例平均 QPS 不变但最热分片下降、尾延迟收敛才说明目标达成。当热点操作需要“只有一个客户端执行”时人们常顺手写SETNX却忽略租约、误删和故障恢复。下一篇将把这些风险收束成一把有明确安全边界的分布式锁。治理验收不要只比较一次MEMORY USAGE。至少跨一个业务高峰记录最热节点 CPU、每秒出站字节、命令 p99、复制 lag 和候选 key 的访问分布拆分后还要确认总 key 元数据没有反向吞掉节省的内存。若采用本地缓存额外测量配置变更传播的最长时间并在通知系统中断时验证 TTL 能自动收敛。对大集合分页接口设置最大页大小和游标有效期防止调用者绕过保护重新发起全量导出。参考来源Redis 官方文档诊断延迟问题Redis 官方文档MEMORY USAGERedis 官方文档UNLINK 觉得有用就点个赞 收藏方便回头查阅有疑问直接在评论区留言我看到都会回。 本文属于《Redis 应用实战》系列持续更新关注不迷路。 文章里的代码都能直接跑。想要可直接 clone 的完整工程 配套部署脚本 / 踩坑清单评论一声或发邮件到cj2664qq.com我免费发你。如果你正好在做类似系统、或有工程化难题想找人做也欢迎邮件聊一句——我按实际情况评估能落地的就接单或出方案。评论和邮件都能直接找到我不用跳别的平台。

相关新闻

2026/9/6 11:37:35

数字化智能工厂总体规划框架、基于MES的数字化车间架构解决方案:未来制造业六大方向、总体规划框架、思路目标、MES功能架构

该框架以智能工厂与智能生产为两大核心,通过MES系统打通研发、供应、物流、生产到客户的全价值链,旨在实现工厂卓越运营。 其核心目标是通过数字化手段解决制造黑箱问题,建立全面追溯体系,最终达成降低不良率20%、提高产出10%及缩…

2026/9/6 11:37:35

重排序缓冲器ROB设计:乱序执行下的有序提交机制详解

1. 重排序要解决的根本问题:乱序执行如何收场 做数字电路流水线设计的人,八成都有过这样的阶段:把五级流水线调通之后,觉得性能瓶颈明显,想上一套乱序执行(Out-of-Order Execution)来压榨IPC&am…

2026/9/6 11:37:35

x86、ARM、RISC-V中断机制深度对比:从触发到返回的六大关键步骤

做底层软件的人,基本都绕不开“中断”这道坎。我最近同时在一块x86板子上调SMP启动、在一颗ARM Cortex-A核上写GIC初始化、又给一个RISC-V核补trap入口,三个平台来回切的时候突然想明白一件事:它们的中断机制看上去八竿子打不着,但…

2026/9/6 12:32:40

多智能体LLM交互中的涌现语言:GlossoGen实验与复现指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/6 12:32:40

别墅铸铝入户门材质工艺技术分析与产业升级路径观察

一、行业技术背景据中国门业协会2024年发布的《中国入户门产业发展白皮书》数据,国内入户门整体市场规模已突破1800亿元,其中面向别墅、高端住宅的铸铝入户门细分赛道年复合增长率达12.7%,是门业领域增速最快的品类之一。国内永康-武义-缙云门…

2026/9/6 12:32:40

第五章 散打排骨精

第一次炖汤,胡萝卜玉米排骨汤,非常成功,汤很鲜美,排骨也很美味还有个炖豆腐也不错,都比较清淡,吃起来暖暖的

2026/9/6 12:27:39

跨Agent会话延续:打破AI Agent供应商锁定的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/6 0:06:59

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/6 0:06:59

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/6 0:06:59

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/6 0:06:59

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/6 0:06:59

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/6 0:06:59

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/6 11:40:10

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/5 2:30:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/6 10:19:40

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…