我把91官网的缓存管理拆给你看:其实一点都不玄学(建议反复看)

我把91官网的缓存管理拆给你看:其实一点都不玄学(建议反复看)

我把91官网的缓存管理拆给你看:其实一点都不玄学(建议反复看)

开门见山:缓存不是魔法,而是一套策略和工程实践的集合。把它拆开来看,能让你的网站更快、更稳定、也更省钱。下面把缓存按层级、原理、实操和排查一步步讲清楚,照着做,效果看得见。

一、缓存分层与作用一览

  • 浏览器缓存(客户端):静态资源(JS/CSS/图片)的首道缓存。靠 Cache-Control、Expires、ETag 控制。
  • CDN/边缘缓存(Edge):把常用静态/动态资源缓存到离用户更近的节点,减小延迟和源站负载。
  • 反向代理缓存(如 Nginx proxy_cache、Varnish):在源站前做缓存,适合整页或 API 缓存。
  • 应用缓存(Redis、Memcached):缓存计算结果、会话、热点数据,减少 DB 压力。
  • 数据库层缓存:查询缓存或物化视图,适合复杂聚合或只读场景。

二、常用缓存控制手段(实操要点)

  • Cache-Control 指令:public/private, max-age, s-maxage(CDN专用)、no-cache/no-store。示例:
  • 静态资源:Cache-Control: public, max-age=31536000, immutable
  • HTML 页面(频繁更新):Cache-Control: no-cache, must-revalidate
  • ETag 与 Last-Modified:用于条件请求,节省带宽但不减少请求次数。
  • 版本化(cache-busting):静态资源文件名带 hash(app.a1b2c3.js),部署即更新 URL,清晰又可靠。
  • Vary 头:当缓存应基于不同请求头(如 Accept-Encoding、User-Agent)拆分时使用,避免缓存污染。

三、典型配置片段(Nginx & CDN)

Nginx 静态资源示例: proxycachepath /var/cache/nginx levels=1:2 keyszone=mycache:10m maxsize=10g inactive=60m usetemppath=off; server { location ~* .(js|css|png|jpg|jpeg|gif|svg)$ { expires 30d; addheader Cache-Control "public, max-age=2592000, immutable"; } location /api/ { proxycache mycache; proxycachevalid 200 30s; addheader X-Cache $upstreamcache_status; } }

Cloudflare/CDN:优先走版本化+短 TTL 的 HTML + 长 TTL 的静态资源。部署时通过 API 批量清除或按路径缓存规则。

四、缓存键设计与用户态分离

  • 匿名与登录用户必须分开缓存。通过 Cookie、Authorization、X-User-ID 等区分 cache key。
  • Cache key 常见组成:scheme + host + uri + query(按需) + headers(如 Accept-Encoding)。
  • 避免把会变的 Cookie、Header 直接纳入 key,除非确实需要。

五、失效策略(Invalidate)——别靠盲目清空

  • 版本化优先:静态资源用内容哈希,部署时直接改变引用即可。
  • 精准清理:对 API/页面提供按 URL/Tag 的 purge 接口,通过 CI 在发布后触发。
  • TTL 与主动清理结合:短 TTL(几十秒到几分钟)用于频繁变更的内容,长 TTL 用于稳定资源。

六、防止缓存雪崩与缓存击穿

  • 缓存雪崩:同一时间大量键过期导致瞬时打到后端。应对方法:错峰设置TTL、随机化过期时间。
  • 缓存击穿:热点 key 失效瞬间大量请求穿透。方案:互斥锁(single flight)、请求合并、降级返回上次数据+异步刷新。
  • 热点保护:对极热数据可以设置内存常驻或预热。

七、监控与排查清单(上线前/上线后都要做)

  • 指标关注:Cache hit ratio、origin load、avg latency、error rate、bandwidth out。
  • 常用排查命令:
  • curl -I https://site/path (看响应头 Cache-Control、Age、ETag、X-Cache)
  • 查看 CDN 或边缘返回头(X-Cache: HIT/MISS)
  • Nginx: tail -f access.log + 查看 $upstreamcachestatus
  • 常见问题与排查方向:
  • 页面不断更新但仍走旧缓存:检查是否用版本化,或 CDN 未正确 purge。
  • 非预期缓存:看响应头是否设置了 public,或 Vary 导致命中失败。
  • 登录态错缓存给匿名:确认 cache key 是否含有用户识别信息或使用 private 指令。

八、落地建议(一步步做,不要一次性改全站) 1) 整理资产:列出 HTML、API、静态资源、图片等分类。 2) 为静态资源上版本化和长 TTL,并开启 CDN 缓存。 3) 对 HTML/动态 API 先用短 TTL 或 no-cache + ETag,逐步评估哪些页面可安全缓存。 4) 在反向代理层启用缓存并逐步扩大策略,同时监控 hit rate 与后端压力。 5) 建立发布流程:部署触发静态资源引用更新 + CI 触发必要的 purge。 6) 加入缓存监控仪表盘(Prometheus/Grafana),设定阈值告警。

结语 缓存不是单一技术,而是一组可配置的工具和方法。把每一层的责任划清、键设计做好、失效策略明确,就能把“不懂缓存看起来玄学”的感觉彻底去掉。反复读、按步骤实验、把监控数据当真理,你会发现改进的空间比你想象的大得多。想把这套体系搬到你的站点上测试?按照上面的清单走一遍,几天之内就能看到数据回报。

下一篇
已到最后
2026-02-26