每次打开网页,浏览器都会把一部分数据保存在本地或中间的服务器上,这样下次访问时就不用重新从源头加载所有内容。这种机制就是网站缓存。合理地使用它,能明显加快页面打开速度,同时减轻服务器的负担,是网站性能优化里非常基础的一项工作。
缓存最直接的效果就是让网站“变快”。对访问者来说,同一个页面第二次打开时几乎是秒开,因为大量重复的资源都从本地读取,省去了网络传输的时间。对网站运营者来说,缓存减少了服务器处理相同请求的次数,在流量突然增大时,服务器不容易被压垮。
举个例子,一个新闻网站首页的 Logo 和导航栏样式是固定不变的。如果没有缓存,每个访客每次刷新都要重新下载这些文件,服务器压力大,访客等待时间也长。有了缓存,这些固定资源只需下载一次。
判断缓存是否有效的标准很简单:重复访问页面时,加载速度是否有明显提升,以及服务器日志中静态资源的请求数量是否显著减少。需要留意的是,缓存并不是越多越好,过期资源如果处理不当,反而会让用户看到旧的内容。
网站缓存是一个组合概念,由多个不同位置的缓存协作完成。搞清楚这些层级,才能对症下药。
这是最靠近用户的一层。服务器通过 HTTP 响应头里的 Cache-Control 或 Expires 字段,告诉浏览器某个文件可以存放多久。比如网站的标志图片,可以设置一年后过期,这样用户下次访问时根本不会请求这张图,直接使用本地副本。
服务器可以把动态生成的页面预先渲染成静态的 HTML 文件保存起来。当用户请求时,直接返回这个静态文件,不再执行数据库查询和后台程序。对于那些内容变化不频繁的页面,比如公司介绍、产品说明,这种方式能让响应速度提升几十倍。
CDN 服务商在全球各地部署了很多节点。用户访问网站时,请求会被路由到离他最近的节点,如果这个节点上已经有缓存的文件,就直接返回,不用跑到源服务器去取。比如一个欧洲用户访问托管在亚洲的网站,他实际是从欧洲本地的 CDN 节点获取的图片,速度自然快很多。
不是所有内容都适合缓存,配置前先做一个简单的分类,能避免很多问题。
常见的配置误区是怕看到旧数据,索性把所有响应都设为 no-cache,这样等于放弃了缓存带来的全部性能提升。更稳妥的做法是,只对含有用户隐私或实时性要求极高的接口禁缓存,静态资源一律打开。
缓存最大的麻烦在于“失效”问题——服务器内容已经更新了,但用户端还留着旧的东西。遇到这种情况,先别急着清空所有缓存。可以先用浏览器开发者工具,在禁用缓存状态下做一次强制刷新,确认新内容能正常加载,再逐步排查是哪一层缓存出现了延误。
解决更新不及时的手段主要有两种:一种是在资源文件名中使用内容指纹,代码只要改一丁点,生成的哈希就完全不同,浏览器自然加载新文件;另一种是在接口请求中加上时间戳参数,这样就绕开了 CDN 对相同 URL 的缓存判断。需要注意的是,这两种方法不要混用在同一模块上,否则会让缓存命中率降低。
遇到线上紧急故障需要立即修复时,可以临时给对应的 URL 加上 ?nocache=当前时间 的查询参数来强制绕过缓存,但这只是应急手段,问题解决后要立刻恢复。
不会。浏览器对本地缓存的存储空间有总量限制,当缓存体积超过配额,浏览器会自动清理最早访问的内容,腾出空间给新资源。你不用担心把有效期设长了会拖慢用户的设备。
在浏览器开发者工具的网络面板里,勾选“Disable cache”选项,就能在开发者工具打开的状态下禁用缓存。同时建议在开发环境配置中默认关闭服务端缓存,只保留代码热更新功能,这样每次改动都能立刻看到效果。
因为除了浏览器缓存,还可能有 CDN 节点缓存和服务端页面缓存在起作用。需要登录 CDN 控制台提交刷新缓存请求,或者在服务器后台手动删除应用生成的缓存文件目录,不同层级的缓存要分别处理。
网站缓存的作用是明显的,它能让页面加载更快、服务器更省力,但前提是配置得当。建议你从静态资源的长效缓存开始做起,给文件加上版本标记,再逐步为动态页面引入服务器端缓存方案,最后考虑接入 CDN。每次调整后,都实际测一下响应速度和资源命中情况,用数据来判断设置是否合理。