HTTP缓存
前言
HTTP缓存
强制缓存
- 强缓存-Cache-Control
- Expires
协商缓存
- Etag/If-None-Match
a). 当浏览器请求服务器的某项资源(A)时,服务器会根据A算出一个哈希值,并通过Etag返回给浏览器,浏览器把ETAG和资源A同时缓存到本地。
b). 当下次向服务器请求该资源时,会通过If-None-Match把ETAG发送给服务器。
c). 服务器再次计算A的哈希值并和浏览器的返回值作比较,如果A发生了变化就把A返回给浏览器(返回值200),如果未发生变化就返回浏览器304(未修改)
- Last-Modified/If-Modified-Since
a). 在浏览器请求服务器的某项资源时,返回资源的同时还有一个Last-Modified的属性标记此文件在服务器端的最后修改时间;
b). 浏览器第二次访问该资源时,会向服务器传送 If-Modified-Since报头,询问该时间之后文件是否被修改过;
c). 如果服务器的资源没有变化,则时间一致,返回304的状态吗,浏览器使用本地缓存;
d). 如果时间不一致,返回200,显示新文件并缓存。
- Etag是标识传输,Last-Modified是时间传输;
- Etag的优先级高于Last-Modified;
- Last-Modified标注的最后修改时间只能精确到秒,如果文件在1秒以内被多次修改,它不能准确标注 文件的最后修改时间;
- 如果文件定期生成,但内容没有任何变化,但是Last-Modified却改变了,导致没法使用缓存;
- 有可能存在服务器没有准确获取文件修改时间,或与代理服务器时间不一致的情况;
- Etag每次服务端生成都需要进行读写操作,而Last-Modified只需要读取操作,Etag消耗更大些;
对比
优缺点
- 减少了冗余的数据传输;
- 缓解了服务器的压力, 大大提高了网站的性能;
- 加快了客户端加载网页的速度;
- 缓存中的数据可能与服务器的数据不一致;
- 消耗内存;