当前位置: 首页 > news >正文

Redis 缓存设计的三条底线:命中率、穿透保护和可恢复性

一、缓存不是把查询结果塞进去

Redis 在国内后端项目里几乎是标配,但缓存事故也集中:缓存击穿打满数据库,热 key 打爆单核,大 key 阻塞主线程,过期策略随意导致旧数据。缓存设计的核心不是“加一层 Redis”,而是明确一致性、失效方式和降级路径。

常见缓存对象可分三类:低频变更的配置数据、高频读取的详情页数据、需要快速计数或排序的临时数据。不同对象不能用同一套 TTL。配置数据可长 TTL 加主动刷新;商品详情适合短 TTL 加随机抖动;排行榜、计数器要考虑落库和重放。

场景推荐策略风险点
商品详情Cache Aside + TTL 抖动更新后短时间旧值
计数器Redis 增量 + 异步落库失败重试要幂等
热门榜ZSET + 定时重算大 key 和全量读取

二、Cache Aside 要写完整

最常用的是 Cache Aside:读时先查缓存,未命中再查数据库并回填;写时先更新数据库,再删除缓存。这里容易犯两个错误:把删除缓存写成更新缓存,或删除失败不处理,导致旧值长期存在。

下面是 Go 写法示例,重点是空值缓存、TTL 抖动和删除失败记录。示例省略了数据库实现,但保留了关键分支。

funcGetProduct(ctx context.Context,idint64)(*Product,error){key:=fmt.Sprintf("product:%d",id)val,err:=rdb.Get(ctx,key).Result()iferr==nil{ifval=="__nil__"{returnnil,sql.ErrNoRows}varp Productreturn&p,json.Unmarshal([]byte(val),&p)}iferr!=redis.Nil{log.Printf("redis get failed: %v",err)}p,err:=repo.FindProduct(ctx,id)iferrors.Is(err,sql.ErrNoRows){_=rdb.Set(ctx,key,"__nil__",time.Minute).Err()returnnil,err}iferr!=nil{returnnil,err}bs,_:=json.Marshal(p)ttl:=10*time.Minute+time.Duration(rand.Intn(120))*time.Second_=rdb.Set(ctx,key,bs,ttl).Err()returnp,nil}funcUpdateProduct(ctx context.Context,p*Product)error{iferr:=repo.UpdateProduct(ctx,p);err!=nil{returnerr}key:=fmt.Sprintf("product:%d",p.ID)returnrdb.Del(ctx,key).Err()}

空值缓存能缓解穿透,但 TTL 必须短,否则新数据可能被旧空值挡住。TTL 抖动能避免同批 key 同时过期。写后删缓存仍有短暂不一致窗口,核心链路要结合版本号、消息补偿或直接绕过缓存。

三、热 key 和大 key 要提前治理

Redis 单个命令很快,但主线程模型决定了大 key 和慢命令会影响其他请求。几 MB 的 String、几万个元素的 Hash、一次KEYS *,都可能让延迟突然上升。生产业务禁止使用KEYS,排查也应使用SCAN

# 查慢日志redis-cli slowlog get10# 观察命令统计redis-cli info commandstats redis-cli--scan--pattern'product:*'|head

热 key 通常用本地缓存、读副本、拆 key 处理。首页配置可放进进程内缓存,设置 5 到 30 秒 TTL;计数类可按用户或时间片分桶再汇总。不要把所有压力都交给 Redis Cluster,集群不能消除单个热 key 的集中访问。

四、故障恢复要能演练

Redis 宕机时,最怕业务把所有请求原样打到数据库。连接池要设置超时,缓存访问要有熔断,关键接口要有降级值。对缓存来说,恢复也不是简单重启实例:如果大量 key 同时失效,恢复后会出现冷缓存,数据库仍然可能被打满。

redis:addr:redis.internal:6379pool_size:100min_idle_conns:10dial_timeout:200msread_timeout:100mswrite_timeout:100msmax_retries:1

实践建议:先列出业务里最重要的 20 个缓存 key,逐个确认 TTL、最大体积、回源成本、删除策略和 Redis 不可用时的行为。命中率只是结果指标,真正要长期维护的是 key 设计、过期策略、慢命令治理和故障演练。

http://www.jsqmd.com/news/1153097/

相关文章:

  • 基于springboot儿童健康饮食平台
  • 开源Office Agent:文档、表格与PPT自动化的新机遇
  • 厦门大学LaTeX论文模板实战指南:学术排版自动化解决方案深度解析
  • ExplorerPatcher深度解析:为什么这个开源项目能彻底改变你的Windows 11界面体验
  • 北京华恒智信为文旅综合体行业搭建跨业态共享用工体系,破解人效低效难题
  • Java之动态代理 DynamicProxy
  • 终极Wallpaper Engine资源提取指南:3分钟掌握RePKG解包神器
  • 接口测试要点、示例、开展接口测试并落地
  • OpenVINO AI音频插件终极指南:在Audacity中免费解锁专业级AI音频处理
  • 低成本GEO优化实操指南
  • 2026 企业 AI 数据分析选型指南:智能问数、归因分析与自动化报告五家横评阅读摘要
  • 从零出发实践SEO,开启流量增长新篇章
  • 从安装到第一个真实任务:Claude Code 的权限模式怎么选
  • 2026年必看:专业解析圆管坡口机进给速度的精准调节方法
  • 鸿蒙三方库 | harmony-utils之AppUtil字体与语言设置详解
  • cuDNN 8.9.7 与 9.2.0 版本选择:基于 PyTorch 2.3 与 TensorFlow 2.15 的 3 点兼容性分析
  • vtkDefaultPass代码解析
  • Spark MLlib 3.4.0 特征工程解析:6维连续特征PCA降维至3维的方差贡献率与可视化
  • 基于ST-DBSCAN的时空密度聚类算法在移动轨迹分析中的技术实现方案
  • Python 时间序列分析实战:3种移动平均法对比与指数平滑系数α选择指南
  • np.percentile和np.clip
  • NVIDIA Profile Inspector中文界面配置全攻略:解锁显卡隐藏功能
  • AMD MI355X与GLM5.2:高性价比AI推理方案的成本效益分析
  • 等保2.0实施方案
  • 当 80% 的数据库由 AI 自动创建,我们需要一个什么样的 PostgreSQL?
  • Unlock-Music终极教程:5分钟学会解锁加密音乐,实现音乐自由播放
  • 华为云DWS磁盘使用率超90%后集群只读
  • 为什么不接负极, 电器就 无法工作?
  • 2026最新8款学生编程助手平替实测|课程设计低成本权威深度盘点
  • 计算机毕业设计之吕梁学院校园一卡通系统的设计与实现