前端之缓存

摘要:
缓存位置Serviceworker浏览器独立线程,要求必须使用HTTPS协议保证安全性缓存持续性。缓存策略缓存策略由HTTPheader实现。强缓存不向服务器发送请求,从缓存中读取。Last-Modified的弊端本地打开缓存文件,就会造成Last-Modified被修改只能以秒计时根据文件是否修改:设置httpheader:Etag和If-None-MatchEtag:资源文件唯一标识,文件修改就会重新生成。
目录

浏览器缓存机制

有缓存查找优先级。

缓存位置

Service worker

  • 浏览器独立线程,要求必须使用HTTPS协议保证安全性
  • 缓存持续性。
  • 步骤:
    • 注册service worker,监听install事件缓存需要的文件
    • 再次访问时,拦截请求并检查缓存,如果存在就直接读取,否则去请求数据。

Memory Cache

  • 内存缓存,包含页面中抓取的资源。关闭页面就释放。
  • 读取速度快。
    preloader相关指令(页面优化)

Disk Cache

  • 硬盘缓存,读取慢
  • 容量,存储时效长

Push Cache

推送缓存http2。
session中存在,会话结束时释放。

缓存过程

浏览器判断资源缓存方式:根据第一次请求资源时返回的响应头确定

  • 浏览器每次请求都会先查找浏览器缓存,缓存没有再去请求服务器。
  • 每次拿到响应结果都会将缓存标识和资源存入浏览器缓存。

缓存策略

缓存策略由HTTP header实现。

强缓存

  • 不向服务器发送请求,从缓存中读取。
  • 设置http header:Cache-control或者Expires
  1. Cache-control(Http 1.1,优先级大于expires)
参数含义
public响应可被任意中间节点缓存
private只能被客户端缓存
no-cache不用强缓存机制(缓存资源但立即失效)
no-store不缓存,不用强缓存和协商缓存
max-age=xxx缓存内容在xxx秒后失效(普通缓存),需重新请求
s-maxage和max-age一样,但只在代理中有效(代理缓存,优先级高)
max-stale表示接受过期缓存,可以设置时限
min-fresh最小新鲜度
  1. Expires(http 1.0)
    指定资源到期时间。

强缓存判断是否缓存的依据来自于是否超出某个时间或者某个时间段,而不关心服务器端文件是否已经更新,这可能会导致加载文件不是服务器端最新的内容

协商缓存

过程:

  • 浏览器向浏览器缓存请求,失效就返回缓存标识
  • 浏览器向服务器发起携带缓存标识的请求
  • 服务器告诉浏览器是否需要更新缓存
    • (304表示不用更新)浏览器向浏览器缓存请求获取缓存。
    • (200表示已更新)服务器返回更新的资源,浏览器将资源存入浏览器缓存
  1. 根据文件修改时间:
    设置http headerLast-ModifiedIf-Modified-Since
  • 第一次访问资源时,响应头中有 Last-Modified 值为资源在服务器上的最后修改时间。
  • 下次请求时,将 If-Modified-Since 的值改为 Last-Modified 的值,发给服务器做对比。

Last-Modified 的弊端

  • 本地打开缓存文件,就会造成 Last-Modified 被修改
  • 只能以秒计时
  1. 根据文件是否修改:
    设置http headerEtagIf-None-Match
  • Etag : 资源文件唯一标识,文件修改就会重新生成。

  • 请求时将Etag 放到If-None-Match中,让服务器对比

  • 对比(Etag 和 Last-Modified):

    • Etag 精确度更高
    • Etag 性能略差
    • Etag 优先级高

缓存机制

先强缓存再协商

实际缓存场景

  1. 经常变化的资源
    Cache-Control: no-cache
    使浏览器每次都请求服务器,配合 Etag 或者 Last-Modified 验证资源有效。

  2. 万年不变
    Cache-Control: max-age=31536000
    强制命中缓存,时间设置为(一年)。
    更新的问题:在文件名(或者路径)中添加 hash, 版本号等动态字符,之后更改动态字符,从而达到更改引用 URL 的目的,让之前的强制缓存失效 (其实并未立即失效,只是不再使用了而已)

用户行为

  • 打开网页,地址栏输入地址: 查找 disk cache 中是否有匹配。如有则使用;如没有则发送网络请求。
  • 普通刷新 (F5):标签页面没有关闭,memory cache 可用,其次才是 disk cache。
  • 强制刷新 (Ctrl + F5):浏览器不使用缓存,Cache-control: no-cache(为了兼容,还带了 Pragma: no-cache), 服务器返回 200 和最新内容。

免责声明:文章转载自《前端之缓存》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇U_Net原理及tensorflow的实现fastdfs 集群搭建下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

meta标签

CreateTime--2017年9月28日15:14:30 Author:Marydon meta标签 1.位置META标签是HTML标记HEAD区的一个关键标签,它位于HTML文档的<head>和<title>之间,它提供的信息虽然用户不可见,但却是文档的最基本的元信息。2.定义META标签用来描述一个HTML网页文档的属性,...

如何设计高性能、高并发、高可用的系统。

感谢度娘,感谢原博主 此文转自:https://www.cnblogs.com/guixia621/p/9245596.html 大型网站的特点   大型网站一般有如下特点: 用户多,分布广泛 大流量,高并发 海量数据,服务高可用 安全环境恶劣,易受网络攻击 功能多,变更快,频繁发布 从小到大,渐进发展 以用户为中心 免费服务,付费体验 大型网站架构目...

CPU高速缓存行与内存关系 及并发MESI 协议

先来一个整体图 一. 大致关系: CPU Cache --> 前端总线 FSB (下图中的Bus) --> Memory 内存 CPU 为了更快的执行代码。于是当从内存中读取数据时,并不是只读自己想要的部分。而是读取足够的字节来填入高速缓存行。根据不同的 CPU ,高速缓存行大小不同。如 X86 是 32BYTES ,而 ALPHA 是 64...

关于WinForm/Web如何使用缓存Cach

Cache 的绝对到期与滑动到期 绝对到期:设置绝对过期时间 到了指定时间以后会失效。(类似Cookie机制) 相对到期也称滑动到期:设置相对过期时间 指定时间内无访问会失效。(类似Session机制) HttpRuntime.Cache与HttpContext.Current.Cache 为同一个对象HttpRuntime.Cache.Add 存在相同...

[转]Nginx 静态资源缓存设置

本文转自:https://www.w3cschool.cn/nginxsysc/nginxsysc-cache.html 在开发调试web的时候,经常会碰到因浏览器缓存(cache)而经常要去清空缓存或者强制刷新来测试的烦恼,提供下apache不缓存配置和nginx不缓存配置的设置。在常用的缓存设置里面有两种方式,都是使用add_header来设置:分别为...

关于php性能优化

php性能优化 1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍。 当然了,这个测试方法需要在十万级以上次执行,效果才明显。 其实静态方法和非静态方法的效率主要区别在内存:静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用...