电商系统的缓存设计 4 层模型

2026年6月19日

【30 秒读完 · 核心结论】 缓存不是越多越好,分层才是关键。
4 层缓存模型:浏览器 → CDN → Redis → 本地缓存。
核心原则:靠近用户、命中率优先、一致性兜底。

电商系统的缓存设计 4 层模型

一、为什么需要缓存?

电商系统的流量特征:

  • 读多写少:浏览/查询是下单的 100 倍
  • 数据热点:80% 流量集中在 20% 商品(头部商品)
  • 实时性要求分层:商品详情可以缓存 5 分钟,库存必须实时

缓存的作用

  • 降低数据库压力(80% 查询被缓存吸收)
  • 提升响应速度(缓存读取比 DB 快 100 倍)
  • 应对高并发(秒杀场景必须用缓存)

二、4 层缓存模型

第 1 层:浏览器缓存(最靠近用户)

缓存内容:静态资源(图片 / CSS / JS / 字体)

缓存方式

  • HTTP 缓存头(Cache-Control / ETag)
  • Service Worker(高级缓存)

优势:用户本地缓存,零延迟

局限:浏览器策略不可控,缓存失效需要主动清理

第 2 层:CDN 缓存(边缘节点)

缓存内容:静态资源 + 缓存 HTML 页面

缓存方式

  • 边缘节点缓存(阿里云 CDN / 腾讯云 CDN / Cloudflare)
  • 边缘计算(CloudFlare Workers)

优势:就近访问,全国 2000+ 节点

局限:无法缓存个性化内容(如用户登录态数据)

第 3 层:Redis 缓存(应用层核心)

缓存内容

  • 商品详情 / 库存数据
  • 用户会话(Session)
  • 热点排行榜
  • 防重放令牌
  • 分布式锁

优势

  • 毫秒级响应
  • 支持丰富数据结构(String / Hash / List / Set / Sorted Set)
  • 集群可水平扩展

局限

  • 数据丢失风险(需要持久化)
  • 容量有限(不适合存大文件)
  • 一致性需要业务兜底

第 4 层:本地缓存(进程内)

缓存内容:配置信息、字典数据、热点 key

缓存方式

  • Caffeine(Java)
  • Guava Cache
  • Ehcache

优势

  • 进程内访问,纳秒级
  • 无需网络 IO

局限

  • 应用重启缓存清空
  • 多节点缓存不一致(需要广播更新)

三、4 层缓存的协同

用户请求经过的链路:

用户请求
  ↓
浏览器缓存(命中?直接返回)
  ↓ 否
CDN 节点(命中?返回)
  ↓ 否
应用服务器本地缓存(命中?返回)
  ↓ 否
Redis 集群(命中?返回并回填本地缓存)
  ↓ 否
数据库(返回并回填 Redis)
  ↓
返回给用户

四、3 个核心原则

原则 1:靠近用户

缓存层级越靠近用户,访问越快。优先使用浏览器缓存 → CDN → Redis → 本地

原则 2:命中率优先

目标命中率

  • 浏览器缓存:60-80%
  • CDN:85-95%
  • Redis:90-99%
  • 本地缓存:50-70%

命中率不达标?

  • 缓存粒度太细(拆 key)
  • 过期时间太短
  • 热点数据没识别

原则 3:一致性兜底

缓存不一致问题:缓存和数据库数据不一致(如库存更新后缓存未更新)。

解决方案

  • Cache Aside:先更新 DB,再删除缓存(最常用)
  • Read Through:缓存作为数据源,DB 同步写入
  • Write Behind:先写缓存,异步写 DB(性能最好但有风险)

五、3 个常见坑

坑 1:缓存雪崩

场景:大量 key 同时过期,所有请求打到数据库。

解决

  • 过期时间加随机偏移(5 分钟 ± 1 分钟)
  • 热点 key 永不过期(异步更新)
  • 熔断降级(数据库压力大时直接返回缓存)

坑 2:缓存击穿

场景:单个热点 key 过期,并发查询全部打到 DB。

解决:分布式锁(只允许一个请求查 DB,其他等)。

坑 3:缓存穿透

场景:查询不存在的 key,每次都打到 DB。

解决

  • 空值缓存(不存在的 key 也缓存,TTL 短)
  • 布隆过滤器(提前判断 key 是否存在)

联系方式:400-025-0992

官网https://www.wanmi.com