【译】-【缓存】最佳实践
本文译自: 这里
本文已同步到我的博客
引言
缓存利用得当的话,有很大益处,比如节省带宽,降低服务器压力等,但是很多网站没能够很好地利用缓存,造成一些相互依赖的资源出现不同步的情况。
关于缓存的处理方案主要可以分为以下两种:
方案一:资源内容保持不变+超长的max-age
Cache-Control: max-age=31536000
- 这个url对应的资源永远保持不变
- 浏览器/CDN可以将该资源缓存很久
- 对于没有超过max-age的缓存内容可以直接使用,而不必再向服务器请求
如下图所示:
在这种情况下,一个url对应的资源应该是一直保持不变的,如果我们想更新资源,只能通过更改url的方式来实现:
<script src="/script-f93bca2c.js"></script> <link rel="stylesheet" href="/styles-a837cb1e.css"> <img src="/cats-0e9a2ef4.jpg" alt="…">
可以看到,url中带有一串码,该码是与资源内容相关的,可以是版本号,修改日期,或者文件内容的hash值。
大部分服务器端的框架会有一些工具来让这件事情变得简单,
可是,这种方式并不适用于一些文章或者博客之类的网站,这些网站的url不能通过版本号来管理,而且内容也是经常需要改变的。
方案二:内容可变,每次都需要服务器再次校验(revalidated)
Cache-Control: no-cache
- 这个url对应的资源是可变的
- 本地缓存只有在服务器验证过是最新的之后才可以使用
(译者注:可参照304场景)
如下图所示:
注意:no-cache
并不是指不缓存,而是指在使用缓存之前,必须首先向服务器端确认资源是否为最新。no-store
指不允许缓存。同样的must-revalidate
并非是指必须重新验证,它的意思是,只有当本地的缓存已经超过最长缓存时间时,才需要重新验证。
在这种场景下,可以在响应头中添加ETag
或者Last-Modified
。这样,当客户端在下次请求的时候,就会在请求头中带上这些信息,分别对应的是If-None-Match
和If-Modified-Since
。服务器端根据该标识判断资源是否为最新的,如果是,则返回304
状态码。
这种设置总是会需要一次网络请求的(来验证本地的缓存资源是否为最新),因此相比于第一种方式,增加了网络请求。
相关推荐
学习web前端 2020-11-09
天空一样的蔚蓝 2020-10-23
curiousL 2020-08-03
sochrome 2020-07-29
SoarFly00 2020-06-28
LeoHan 2020-06-02
GimmeS 2020-05-15
逸璞丷昊 2020-03-08
DAV数据库 2020-05-07
Vampor 2020-05-01
ROES 2020-04-22
lifeforbug 2020-03-18
zhangwentaohh 2020-03-04
Freshairx 2020-11-10
liuyuchen 2020-10-27
chenhaimeimeng 2020-08-15
东哥笔记 2020-08-14
幸运小侯子 2020-08-14
vanturman 2020-08-01
shawls 2020-07-29
buaichidoufu 2020-07-28
guoyun0 2020-07-19
LinuxJob 2020-06-26
韩学敏 2020-06-17