网站缓存是提升性能最有效的方法之一,但“缓存”一词可以指代几种截然不同的技术。.
浏览器缓存、CDN 缓存、服务器页面缓存和对象缓存都能减少重复工作——但它们在请求路径的不同环节发挥作用。.
了解这些区别非常重要,因为部署对象缓存并不能替代 CDN,而启用浏览器缓存也无法消除针对未缓存请求的高成本服务器端处理。.
本指南介绍了 网站缓存, ,对比了主要缓存类型,并展示了多层缓存如何协同工作以加快网站运行速度。.
浏览器 → CDN → 服务器缓存 → 应用程序 → 对象缓存 → 数据库

什么是网站缓存?
缓存是指将可重复使用的数据或内容临时存储起来,这样在每次被请求时,就无需从原始来源重新生成、下载或检索这些数据或内容。.
如果不进行缓存,一个动态请求可能如下所示:
访问者 → Web 服务器 → 应用程序 → 数据库 → 生成页面 → 访问者简体中文(大陆)
如果成千上万的访问者请求的内容基本相同,服务器可能会将其中大部分工作重复执行数千次。.
通过缓存,有时可以复用之前生成的结果:
访问者 → 缓存 → 预备响应
这可以减少:
- 页面生成时间
- CPU 使用率
- 数据库查询
- 源带宽
- 网络延迟
- 应用程序工作负载
其核心原则很简单:
一次投入精力完成高成本的工作 → 在安全的情况下重复利用结果。.
浏览器 vs 服务器 vs CDN vs 对象缓存
| 缓存类型 | 栖息地 | 通常存储的内容 | 主要优势 |
|---|---|---|---|
| 浏览器缓存 | 用户设备 | 图片、CSS、JS、字体 | 减少重复下载 |
| CDN 缓存 | 边缘网络 | 静态资源、可缓存的 HTML | 降低延迟和源站流量 |
| 服务器/页面缓存 | 源/服务器层 | 生成的页面/响应 | 避免重复生成页面 |
| 对象缓存 | 服务器内存/缓存服务 | 查询结果和应用程序对象 | 减少后端工作的重复 |
这些缓存方法是相辅相成的,而非相互排斥的。.
一个高性能网站可能会同时使用这四种技术。.
1. 浏览器缓存详解
浏览器缓存会将可重复使用的网站资源存储在访问者本人的设备上。.
当用户首次访问一个页面时,浏览器可能会下载以下资源:
- 图片
- CSS
- JavaScript
- 字体
- 图标
当访客打开另一个页面——或稍后返回时——浏览器可能会重用这些本地资源,而无需再次下载。.
区别在于:
首次访问
浏览器 → 服务器 → 下载资源
再次光临
浏览器 → 本地缓存 → 重复使用资源
浏览器缓存何时最有用
对于不会在每次请求时都发生变化的资源,浏览器缓存特别有用。.
例如:徽标、样式表、字体和带版本号的 JavaScript 文件。.
这可以减少重复的网络传输,让页面间的跳转感觉更快。.
浏览器缓存限制
浏览器缓存属于每位访问者。.
如果一位完全陌生的访客打开您的网站,该访客的浏览器中尚未缓存您的资源。.
因此,浏览器缓存并不能取代服务器端或CDN缓存。.
浏览器缓存 = 用户端的资源复用。.
2. CDN 缓存详解
CDN缓存将网站资源存储在分布式边缘基础设施上,而不仅仅存储在源服务器上。.
未使用 CDN 时:
访问者 → 源服务器
使用边缘缓存时:
访问者 → 附近的 CDN 边缘节点 → 缓存资源
如果请求的资源已在边缘服务器上缓存,CDN 可以直接返回该资源,而无需向源服务器请求新的副本。.
这可以带来两大好处:
- 缩短地理上分散的用户之间的网络距离
- 减少到达源服务器的请求数量
CDN缓存对于图片、CSS、JavaScript、字体、下载文件及其他可缓存内容尤其有效。.
某些架构在条件允许且安全的情况下,还可以缓存 HTML 响应。.
如需全面了解何时适合使用边缘缓存,请参阅我们的 CDN 与非 CDN 对比指南.
什么是 CDN 缓存命中?
CDN 请求可能会导致缓存命中或缓存未命中。.
缓存命中
请求的内容在边缘节点上已存在。.
访客 → 边缘 → 内容
缓存未命中
该边缘节点没有有效的缓存副本,需要从源服务器获取该资源。.
访问者 → 边 → 源节点 → 边 → 访问者简体中文(大陆)
更高的有效缓存命中率通常意味着有更多符合条件的请求无需回访源服务器即可得到响应。.
然而,盲目地追求缓存命中率的最大化并非目标。不应仅仅为了提高某项指标,就错误地将个性化、私有或快速变化的内容纳入缓存。.
将可安全缓存的内容进行缓存。.
3. 服务器页面缓存详解
服务器端页面缓存解决的是另一个问题:反复生成相同的响应。.
考虑一个动态的CMS页面。.
不使用页面缓存时:
请求
↓
应用
↓
数据库查询
↓
生成 HTML
↓
回复
启用页面缓存时:
请求
↓
页面缓存
↓
已准备好的 HTML
当可以提供有效的缓存页面时,就可以避免耗时的应用程序和数据库处理。.
这就是为什么全页缓存能为内容密集型网站带来显著的性能提升的原因之一。.
服务器缓存可能存在于哪些位置?
根据托管架构的不同,服务器端缓存可以在不同的层级上实现。.
例如:
- Web 服务器缓存
- 反向代理缓存
- 应用程序页面缓存
- 托管平台的缓存
- CMS缓存系统
理解目的比具体实现更重要:
如果已有有效的副本,请勿重新生成同一页面。.
4. 对象缓存详解
对象缓存的作用范围更深入地渗透到动态应用程序内部。.
对象缓存不会存储整个已生成的页面,而是存储应用程序可能反复需要的可重用数据片段。.
例如:
应用程序 → 数据库查询 → 结果
可能会变成:
应用程序 → 对象缓存 → 结果
当已经存在有效的缓存结果时。.
常用的持久化对象缓存技术包括 Redis 和 Memcached。.
对象缓存可以减少重复的数据库查询和应用程序处理,特别是在无法始终实现全页面缓存的动态网站上。.
页面缓存与对象缓存
这一区别尤为重要。.
| 功能 | 页面缓存 | 对象缓存 |
|---|---|---|
| 商店 | 生成的完整回复/页面 | 可重用数据或对象 |
| “跳过申请”功能能否正常工作 | 通常是的 | 通常能减少部分工作量 |
| 可减少数据库查询 | 间接地/强烈地 | 直接 |
| 最适合 | 可缓存页面 | 动态应用程序 |
| 示例 | 页面/反向代理缓存 | Redis、Memcached |
对象缓存并不意味着页面缓存就不再必要。.
此外,对于绕过全页缓存的请求,页面缓存并不会使对象缓存变得毫无用处。.
页面缓存 ≠ 对象缓存。.
多层缓存是如何协同工作的
一个经过良好优化的网站可能会使用如下所示的请求路径:
访客
↓
浏览器缓存
↓
CDN 边缘缓存
↓
服务器页面缓存
↓
应用
↓
对象缓存
↓
数据库
该请求只需向下传递到必要的深度即可。.
如果浏览器已经拥有一个有效的资源,则可能无需再次下载该资源。.
如果 CDN 能提供该内容,源服务器可能不会收到该请求。.
如果 CDN 未能命中,但源页面缓存中已有该响应,则应用程序可能无需重新生成该响应。.
如果请求到达应用程序,对象缓存仍可能避免重复的数据库操作。.
由此,我们得到了最重要的缓存原则:
安全缓存响应得越早,栈中其余部分需要处理的工作就越少。.
什么是缓存过期?
缓存内容未必能永久保存。.
网站会发生变化。.
文章会更新,产品价格会变动,CSS 会修改,应用程序数据也会发生变化。.
因此,缓存系统需要制定规则,以控制缓存内容的有效期。.
这通常用 TTL(生存时间)来描述。.
从概念上讲:
资源已缓存 → TTL → 过期时间 → 刷新
更长的缓存有效期可以减少重复工作,但如果未正确处理缓存失效,则会增加提供过期内容的风险。.
更短的有效期能提供更新鲜的内容,但可能会导致更多的源服务器请求。.
正确的 TTL 取决于资源发生变化的频率。.
什么是缓存清除?
有时你无法等待缓存内容自然过期。.
如果您更新了重要页面、样式表或图片,可能需要让新版本立即显示出来。.
缓存清除会删除或使现有的缓存副本失效,以便下一次请求能够获取更新后的内容。.
根据平台的不同,您可能可以清除:
- 一个 URL
- 一组资源
- 缓存标签
- 整个缓存
每当某个小资源发生变化时就清空整个缓存,通常不如有针对性地使缓存失效高效。.
什么是缓存破坏?
当静态文件发生变化时,通常会使用缓存刷新。.
与其让浏览器或缓存去猜测旧文件是否仍然有效,不如在部署新版本时直接更改资源的 URL。.
例如:
style.css?v=1
可能会变成:
style.css?v=2
或者,生产构建系统可能会生成带版本号的文件名。.
新的 URL 会告知缓存,这实际上是一个不同的资源。.
这使得在延长缓存有效期的同时,仍能可靠地部署更新的资源。.
哪些内容不应随意缓存?
并非每条回复都应在用户之间共享。.
需要谨慎制定缓存规则的示例包括:
- 购物车
- 结账页面
- 用户账户页面
- 管理员仪表盘
- 个性化内容
- 私有 API 的响应
- 身份验证页面
- 敏感的用户数据
公共静态资源的缓存错误可能会导致样式过时。.
涉及用户私有内容的缓存错误可能会演变成严重的安全和隐私问题。.
速度更快绝不能成为错误缓存私有数据的借口。.
网站缓存与WordPress
WordPress 可以从缓存中获益匪浅,因为未缓存的页面可能需要执行 PHP 代码并进行数据库查询。.
一个 WordPress 性能技术栈可能会使用:
浏览器缓存
↓
CDN 缓存
↓
整页缓存
↓
PHP / WORDPRESS
↓
REDIS 对象缓存
↓
数据库
然而,缓存插件越多并不一定意味着性能就越好。.
安装多个功能重叠的页面缓存、代码压缩或优化插件可能会导致冲突。.
应采用一种清晰的缓存架构,而不是在不了解每种工具具体功能的情况下将它们堆叠在一起。.
有关更广泛的优化过程,请参阅 如何加快WordPress的速度.
您需要 Redis 对象缓存吗?
并非每个网站都需要 Redis。.
当应用程序执行无法仅通过全页缓存来消除的重复数据库操作时,持久化对象缓存的价值就更加凸显。.
示例可能包括:
- 内容丰富的动态网站
- 电子商务商店
- 会员制网站
- 经过身份验证的应用程序
- 复杂的CMS安装
- 数据库密集型工作负载
对于小型静态网站或页面缓存程度较高的网站而言,其收益可能要小得多。.
在仅仅因为Redis听起来更快就添加它之前,请先确定究竟是数据库还是应用程序的工作才是真正的瓶颈。.
缓存能否改善核心网络指标?
缓存有助于加快内容加载速度,但并不能自动解决所有“核心网络指标”问题。.
例如,更快的缓存交付可能会加快重要内容的呈现速度。.
但仅靠缓存无法解决:
- 过多的客户端 JavaScript
- 主线程中的长时间任务
- 版面调整
- 图片尺寸不合适
- 用户交互速度慢
关于这些问题,请参阅我们的 核心网络指标优化指南.
缓存过多会引发问题吗?
是的。缓存设计不当可能会导致:
- 过时的内容
- 旧版 CSS 或 JavaScript
- 过时的价格
- 登录问题
- 购物车问题
- 个性化功能失效
- 调试中的困惑
这就是为什么缓存的设计应围绕内容生命周期展开。.
目标并非:
将一切永久缓存。.
目标是:
缓存正确的内容 → 在正确的层级 → 并保持适当的时间长度。.
缓存与更快的托管服务
缓存和服务器升级解决的是不同的问题。.
假设某个页面需要进行大量的 PHP 和数据库处理。.
更快的 CPU 可能能更快地生成该页面。.
但如果同一页面可以安全地缓存,那么避免重复生成可能效率更高。.
这并不意味着缓存会使服务器性能变得无关紧要。.
未缓存的请求仍然取决于底层基础设施。.
最出色的建筑设计融合了以下要素:
高速服务器 + 高效的缓存。.
如果启用缓存后您的网站仍然运行缓慢,请使用我们的 服务器运行缓慢故障排除指南 以识别 CPU、内存、磁盘和网络方面的瓶颈。.
网站缓存中的常见错误
假设每个缓存都做同样的事情
浏览器、CDN、页面和对象缓存分别在不同的层级上运行。.
在没有计划的情况下部署多个缓存系统
工具之间的重叠可能会导致冲突,并使故障排除变得困难。.
将个性化页面公开缓存
私有和针对特定用户的响应需要设置适当的缓存控制。.
在所有地方都采用极短的缓存生命周期
这可能会导致不必要的重新验证或重新生成,从而降低缓存带来的效益。.
在不进行版本控制的情况下使用极长的缓存生命周期
访问者可能会继续收到过时的资源。.
不断清空整个缓存
频繁地清空整个缓存会降低缓存效率,并可能突然增加源服务器的负载。.
在不测量数据库的情况下添加 Redis
对象缓存无法解决所有的性能瓶颈。.
如何选择合适的缓存层
| 问题 | 需要考虑的缓存层 |
|---|---|
| 重复静态下载 | 浏览器缓存 |
| 全球静态内容分发 | CDN 缓存 |
| 重复生成页面 | 服务器/页面缓存 |
| 重复的数据库/应用程序数据 | 对象缓存 |
| 全球流量 + 昂贵的页面生成成本 | CDN + 页面缓存 |
| 动态应用程序 + 重复的数据库查询 | 对象缓存 |
| 完整的性能栈 | 多个协调的缓存层 |
网站缓存常见问题解答
什么是网站缓存?
网站缓存会临时存储可重复使用的内容或数据,以便浏览器、边缘网络或服务器避免反复下载或生成相同的资源。.
浏览器缓存和CDN缓存有什么区别?
浏览器缓存将资源存储在单个访问者的设备上。CDN缓存则将资源存储在分布式边缘基础设施上,该基础设施可为众多访问者提供服务。.
页面缓存和对象缓存有什么区别?
页面缓存通常存储已加载完成的页面或响应,而对象缓存则存储可重复使用的应用程序数据,例如查询结果或计算得到的对象。.
Redis 是一种页面缓存吗?
Redis 是一种内存数据存储系统,通常用于持久化对象缓存。不应自动将其视为全页缓存的替代方案。.
CDN 能否取代服务器缓存?
不,CDN 和服务器缓存可以相辅相成。如果边缘请求未命中,源服务器的页面缓存仍可避免耗时的应用程序处理。.
缓存能让网站运行得更快吗?
通常是的,当它能减少重复的网络传输、应用程序执行或数据库操作时。性能提升的程度取决于工作负载以及造成瓶颈的具体层级。.
我应该定期清除网站的缓存吗?
这不仅仅是一项例行维护。在相关更改后,应在必要时清除或失效缓存内容。频繁清除有效的缓存可能会降低性能。.
缓存会导致网站崩溃吗?
不正确的缓存规则可能会导致内容过时、资源过期、身份验证问题或个性化问题。修改缓存行为后,请测试重要功能。.
网站缓存检查清单
- ✓ 启用适当的浏览器缓存
- ✓ 高效缓存静态资源
- ✓ 考虑为分布式访问者启用 CDN 缓存
- ✓ 在响应可以安全重用的情况下,使用全页缓存
- ✓ 对于重复访问的后端数据,可考虑采用对象缓存
- ✓ 设置适当的缓存有效期
- ✓ 使用版本控制来管理静态资源的变更
- ✓ 适当排除私人和个性化内容
- ✓ 尽可能只清除需要失效的数据
- ✓ 监控 CDN 缓存命中率
- ✓ 测量缓存前后服务器的负载
- ✓ 避免在没有明确架构的情况下使用功能重叠的缓存工具
最终建议
理解它的最简单方法是 网站缓存 就是不要再把“缓存”视为一种技术。.
一个现代网站可以包含多个层:
浏览器缓存
重复利用访客设备上的资源。.
↓
CDN 缓存
将可复用的内容更接近访客地提供。.
↓
服务器页面缓存
请避免重新生成同一页面。.
↓
对象缓存
避免重复进行成本高昂的应用程序和数据库开发工作。.
↓
数据库
仅处理那些无法提前解答的工作。.
目标并不是将所有现有的缓存技术都加入进来。.
目标是识别重复工作,并在最合适的层面上予以消除。.
不要把所有内容都缓存起来。.
在正确的层级缓存正确的内容。.





