协商缓存和强缓存

缓存的优点

1.减少不必要的数据传输,节省宽带
2.减少服务器负担,提升网页性能
3.加快客户端加载网页的速度
4.用户体验友好

缺点

资源如果有更改,但客户端不及时更新会造成用户信息滞后,如果老版本有bug的话,情况会更糟糕

强缓存

强缓存就是强制缓存的意思,当浏览器去请求某个文件时,服务端就在返回头中对该文件进行了缓存配置

response header中 cache-control 常见的设置是max-age public private no-cache no-store

  1. max-age 表示缓存的时间 单位s
  2. public 表示可以被浏览器缓存和代理服务器缓存 代理服务器可以用nginx
  3. immutable 表示该资源永远不变,但实际上该资源并不是永远不变,这么设置的意思是让用户刷新页面的时候不会去重新请求该资源
  4. private 表示只让客户端缓存即浏览器,代理服务器不可以缓存
  5. no-cache
    表示跳过设置强缓存,但是不妨碍设置协商缓存;一般如果做了强缓存,只有在强缓存失效才走协商缓存,设置了no-cahe就不会走强缓存了,每次都会请求服务端
  6. no-store 表示不设置缓存,也就没有所谓的强缓存和协商缓存了

协商缓存

强缓存是给资源设置一个过期时间,客户端每次请求资源时都会看看是否过期,如果没有过期=>浏览器读取本地缓存 过期了才会继续向服务端请求,而请求服务器的过程就可以设置协商缓存

response header中 etag、last-modified
etag:每个文件有一个,改动文件了就变了,是一个文件hash
last-modified 文件的修改时间,精确到秒

在每次请求返回的返回头中都有etag和last-modified ,在下次请求时请求头就会把这两个带上,服务端会把带来的两个标识进行比对,然后判断资源是否更改,如果资源没有更改,那就不变etag和last-modified,浏览器会读取本地缓存,如果资源发生更改了,就直接返回新的资源以及新的etag和last-modified

只有协商缓存的流程

  1. 资源没有变的情况
    客户端发送请求带着etag和last-modified =>服务端查看资源是否发生改变=>未改变,eatg和last-modified不变,浏览器读取本地缓存 304
  2. 资源发生改变
    客户端发送请求带着etag和last-modified =>服务端查看资源是否发生改变=>改变,返回新的资源 及新的etag和last-modified 200

强缓存和协商缓存都有的情况
客户端请求资源=> 已过期 => 进行协商缓存
客户端请求资源=> 未过期 => 浏览器读取本地缓存 200

注:在返回头response header 中的etag和last-modified在客户端重新发起请求时在请求头request header中换个key名:
etag -> if-none-matched
last-modified -> if-modified-since

为什么要有etag?
http1.1中新增的etag,为了解决之钱last-modified比较难解决的问题
1.一些文件也许会周期性的更改,但是他的内容并没有发生实际的改变,变得只是修改时间,这个时候我们并不希望客户端认为这个文件修改了,需要去重新请求
2.某些文件被修改的十分频繁,比如在秒以下的时间进行修改,比如1s修改了n次,if-modified-since能检查到的粒度时秒级的,这种修改无法去判断
3.某些服务器不能精确的得到文件的最后修改时间

你可能感兴趣的:(javascript学习,缓存,服务器,java)