当前位置:首页 > 文章列表 > 数据库 > Redis > Redis 热 Key 治理实战:发现访问倾斜、拆分缓存和本地兜底

Redis 热 Key 治理实战:发现访问倾斜、拆分缓存和本地兜底

来源:17golang原创 2026-06-13 03:10:27 0浏览 收藏

接口压测时最容易被忽略的问题之一,是缓存并没有慢,但某一个 Key 被打得太热:大部分请求都挤到同一个 Redis 节点,应用线程在等待缓存返回,数据库又担心缓存失效后的瞬时回源。热 Key 治理不是简单加机器,而是先找到倾斜,再让请求有层次地被削峰。

适合人群:正在维护 Redis 缓存、商品详情、配置中心、活动页、排行榜等高频读取接口的后端同学。读完后你可以把热 Key 排查步骤和保护链路直接套到自己的业务里。

目录

  • 热 Key 的典型现象
  • 如何定位访问倾斜
  • 保护链路:本地短缓存 + singleflight + 过期时间抖动
  • 拆分缓存与降级策略
  • 常见坑和上线检查

一、热 Key 的典型现象

热 Key 指某个或少数几个缓存 Key 承担了远高于平均值的访问量。它常见于秒杀商品详情、首页配置、热门文章、城市列表、直播间状态等场景。问题出现时,Redis 整体 QPS 可能看起来还好,但某个分片的网络、CPU 或连接队列已经明显偏高。

可以先用三类信号判断是否有访问倾斜:

  • 应用侧:某个接口 P95/P99 抖动,慢日志集中在读取同一类缓存。
  • Redis 侧:某个节点的输入输出流量明显高于其他节点。
  • 业务侧:某个商品、活动、配置在短时间内被大量读取。

二、如何定位访问倾斜

定位热 Key 时,先从低侵入的指标和采样开始。线上不要直接全量扫描大库,优先用 Redis 自带统计、代理层访问日志、应用埋点组合判断。

# 观察命令调用量和耗时趋势
redis-cli info commandstats | grep -E 'cmdstat_get|cmdstat_mget|cmdstat_hget'

# 在支持 LFU 的实例上观察热点采样
redis-cli --hotkeys

# 观察延迟变化,确认是否和业务高峰同步
redis-cli --latency-history -i 1

如果应用侧可以加一层轻量采样,建议记录“缓存 Key 模板 + 业务 id + 命中状态 + 耗时”。不要只记录完整 Key,否则日志量会上去;也不要只记录接口名,否则无法定位到具体对象。

Redis 热 Key 从业务流量到采样指标再到热点定位的流程图

三、保护链路:本地短缓存 + singleflight + 过期时间抖动

发现热 Key 后,最实用的一条保护链路是:应用先查本地短缓存,本地没有再查 Redis;如果 Redis 也没有,用 singleflight 合并同一 Key 的加载请求;写回缓存时给 TTL 加一点随机抖动,避免一批热点同时失效。

type HotCache struct {
    redis RedisClient
    local LocalCache
    group singleflight.Group
}

func (h *HotCache) GetProduct(ctx context.Context, id int64) ([]byte, error) {
    key := fmt.Sprintf("product:%d", id)

    if value, ok := h.local.Get(key); ok {
        return value, nil
    }

    value, err, _ := h.group.Do(key, func() (any, error) {
        if cached, ok := h.local.Get(key); ok {
            return cached, nil
        }

        data, err := h.redis.Get(ctx, key)
        if err == nil && len(data) > 0 {
            h.local.Set(key, data, 3*time.Second)
            return data, nil
        }

        fresh, err := loadProductFromDB(ctx, id)
        if err != nil {
            return nil, err
        }

        ttl := 5*time.Minute + time.Duration(rand.Intn(60))*time.Second
        _ = h.redis.Set(ctx, key, fresh, ttl)
        h.local.Set(key, fresh, 3*time.Second)
        return fresh, nil
    })
    if err != nil {
        return nil, err
    }
    return value.([]byte), nil
}

这段逻辑的重点不是把本地缓存时间设得很长,而是用 2 到 5 秒挡住瞬时尖峰。singleflight 负责把同一 Key 的并发加载合成一次,TTL 抖动则减少同一批缓存同时过期的概率。

Redis 热 Key 保护链路中本地短缓存、合并加载、Redis 回写和数据库兜底的流程图

四、拆分缓存与降级策略

如果一个 Key 长期保持极高访问量,单纯靠本地缓存还不够,可以考虑按业务读法拆分:

  • 把大对象拆成基础信息、库存状态、活动状态等多个 Key,减少每次读取的数据量。
  • 对只读配置类数据增加本地定时刷新,让接口请求少走远程缓存。
  • 对排行榜、热门列表这类读多写少数据,准备只读副本或静态快照。
  • 对非核心字段设置降级默认值,缓存异常时优先保住主流程。

拆分时要注意一致性边界。比如商品标题和封面可以慢一点刷新,价格和库存不能随意放宽。不同字段的刷新频率不同,缓存模型也应该不同。

五、常见坑和上线检查

1. 本地缓存不是越久越好

本地缓存时间过长会带来数据不一致,尤其是价格、权限、状态类字段。热 Key 保护通常只需要几秒,让峰值请求在应用内被吸收即可。

2. 只加随机 TTL 不等于解决热 Key

TTL 抖动主要解决“同时失效”,但访问倾斜仍然存在。真正的治理要配合本地短缓存、合并加载、拆分对象和限流降级。

3. 上线前要看三组指标

  • 接口 P95/P99 是否下降,错误率是否稳定。
  • Redis 热点节点的流量是否回落,连接数是否平稳。
  • 数据库回源次数是否可控,缓存失效时是否出现突刺。

总结

Redis 热 Key 治理的顺序可以记成四步:先用指标和采样发现倾斜,再用本地短缓存削峰,用 singleflight 合并加载,用 TTL 抖动和缓存拆分降低集中失效风险。这样做的好处是改动小、回滚简单,也能把压力从 Redis 单点分散到应用层的短时缓冲里。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Python pathlib 批量整理文件实战:按扩展名归档和冲突重命名Python pathlib 批量整理文件实战:按扩展名归档和冲突重命名
上一篇
Python pathlib 批量整理文件实战:按扩展名归档和冲突重命名
Go HTTP 服务优雅停机实战:信号处理、摘流和超时关闭
下一篇
Go HTTP 服务优雅停机实战:信号处理、摘流和超时关闭
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ChatExcel酷表:告别Excel难题,北大团队AI助手助您轻松处理数据
    ChatExcel酷表
    ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
    7992次使用
  • Any绘本:开源免费AI绘本创作工具深度解析
    Any绘本
    探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
    8408次使用
  • 可赞AI:AI驱动办公可视化智能工具,一键高效生成文档图表脑图
    可赞AI
    可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
    8229次使用
  • 星月写作:AI网文创作神器,助力爆款小说速成
    星月写作
    星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
    10141次使用
  • MagicLight.ai:叙事驱动AI动画视频创作平台 | 高效生成专业级故事动画
    MagicLight
    MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
    9010次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码