热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

360浏览器清除缓存_浅谈Nginx与浏览器缓存与优化

前言程序员:我写的程序会有Bug?清除一下缓存再试试。测试:我清除完缓存如果还有Bug,我40米的大刀只允许你跑3.1415926米。用户:什么情况,怎么每次浏览页面都要等这么长时

前言

程序员: 我写的程序会有Bug? 清除一下缓存再试试。

测试: 我清除完缓存如果还有Bug, 我40米的大刀只允许你跑3.1415926米。

用户: 什么情况, 怎么每次浏览页面都要等这么长时间, 这届程序员不大行啊!

...

以上的情景可能每天都在发生, 身为开发者对缓存这个概念一定也不会陌生, 大家在工作和生活中多多少少会碰到缓存产生的问题或者缓存相关的优化方案, 今天我们就深入浅出的聊聊 缓存 的那些事。

什么是浏览器缓存

浏览器缓存就是把一些资源或数据放到浏览器的内存或磁盘中, 当用户再次请求对应资源时, 可以更快速的获取以此提高用户体验。

一般是将一些用户频繁访问的界面或者很少发生变化的内容用户缓存。

但无论什么形式的缓存基本上都可以用一句话概括: 以节省计算机资源提升发起者获取数据的速度

使用缓存的俩种交互

  • 协商缓存
    • 用户发送请求后, 由服务器判定是否从缓存中获取资源
  • 强缓存
    • 用户发送请求后, 直接从缓存中获取, 不与服务器进行交互

浏览器缓存的默认行为

当服务器和客户端双方都没有对缓存方式进行协定, 那么浏览器默认缓存策略如下:

文件缓存时长
html不缓存, 每次向服务器发送请求确认
js强缓存
css\img\fonts强缓存

可以看得出来, 如果静态资源命中强缓存且资源发生变化时, 用户无法获取到最新资源, 这种问题如何解决呢 ?

石器时代之--

解决这种问题时, 习惯在引用的静态资源后面拼接一个 时间戳或者版本号, 每次发版的时候与上一次不同, 以此告诉浏览器资源有变化需重新请求。

大前端时代之--

第101种方法纯属瞎扯, 只是以此来形容大前端时代的繁荣以及各种层出不穷的强大的构建工具, 下面介绍 webpack 的实现方式。

Webpack Hash

webpack 打包时会更新对应的 hash 文件路径, 当入口文件内引用静态资源路径发送变化时, 协商缓存就会失效进而重新请求资源。

entry:{
    main: path.join(__dirname,'./main.js'),
    vendor: ['react', 'antd']
},
output:{
    path:path.join(__dirname,'./dist'),
    publicPath: '/dist/',
    filname: 'bundle.[chunkhash].js'
}

Webpack Hash 三种计算方式

  • hash: 构建生成的 hash 都是一样的, 意味着只要项目中有更改整个项目的 hash 都会变化
  • chunkhash: 根据不同的入口对所依赖的文件进行解析, 生成对应的 chunkhash 值
  • contenthash: 有文件内容产生的 hash 值, 内容不同产生的 contenthash 值也不一样

contenthash 的应用场景:

  • 比如当 css 和 js 共用的 chunkhash 因 js 改变而发生变化时, 页面也需要重新加载 css 文件, 解决的这种场景的问题
  • 可以使用 extra-text-webpack-plugin, 保证 css 文件所处的模块就算文件内容改变, 只要css文件内容不变, 那么就不会重复构建

总结: 也就是说如果项目中使用了 webpack 的这种构建工具, 配合浏览器的默认缓存策略, 一般也会有不错的用户体验。

ps: 老款旧版浏览器表现可能会有差异

缓存设置

浏览器、Nginx、服务器都可以对缓存进行设置, 但目前主流是在 Nginx, 因为相对比较灵活、统一

HTTP 1.0 缓存指令

Expires: [time|epoch|max|off;

缺点: 以服务器时间为准生成的绝对过期时间, 当服务器与客户端时区不一致时, 会导致缓存效果出现偏差。

HTTP 1.1 缓存指令

Cache-control: no-cache
Cache-control: no-store
Cache-Control: max-age=
...

Cache-control: 可以看做是 Expires 的完善, 以客户端的时间为准

缓存方式:

  • public: 默认值, 响应会被缓存, 并且在多用户间共享
  • private: 响应只作为私有缓存, 不能在用户间共享
  • no-cache:
    • 指定不缓存响应, 表明资源不进行缓存
    • 但不代表浏览器不缓存, 而是在缓存前要向服务器确认资源是否被更改
  • no-store: 绝对禁止缓存, 每一次都需要重新获取资源

到期时间:

  • max-age:
    • 设置缓存的有效时间, 单位为秒
    • max-age > 0时直接从浏览器缓存中提取
    • max-age <0时向 server 发送请求进行协商
    • 优先级高于 Expires
  • s-maxage:
    • 只用于共享缓存, 比如 CDN缓存
    • 优先级高于 Expires/max-age

重新验证和加载:

  • must-revalidate: 如果页面过期, 则去服务器进行获取

注意:

  • private: max-age 为正数时, 后退不会访问服务器
  • no-cache: max-age 为正数时, 后退会访问服务器

缓存协商

服务器会对请求头部的信息进行匹配和检测的过程

Response Header:

  • Last-modified: 资源最后一次的修改时间
  • Etag: 资源内容的标识

Request Header:

  • If-Modifired-Since:
    • 其值是上次请求服务响应的 Last-modified
    • 服务器会根据 If-Modifired-Since 的值与当前最新的 Last-modified 进行比较
    • 局限: 由于时间只能精确到秒, 意味着 无法有效缓存一秒内的多次改动
  • If-None-Match:
    • 其值是上次请求服务响应的 Etag
    • 服务器会根据 If-None-Match 的值与当前最新的 Etag 进行比较
    • 优先级高于 If-Modifired-Since
  • 相同处: 对应比较字段匹配则返回 200 或 304
  • 不同处: 时间与内容俩个维度

注意:

  • 分布式系统尽量关闭 Etag, 因为每台机器生成的 Etag 都不一样
  • 分布式系统里多台机器文件的 Last-Modified 必须一致, 以免负载均衡不同导致对比失败

用户行为影响浏览器缓存行为

用户操作Expires/Cache-ControlLast-Modified/Etag
地址栏回车有效有效
页面链接跳转有效有效
新开窗口有效有效
前进、后退有效有效
F5刷新无效有效
Ctrl&#43;F5刷新无效无效

浏览器与服务器缓存交互图

2933a227a24314698d5b789e4391f5ea.png

IMAGE



推荐阅读
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
author-avatar
aaaaaaaaaa本尊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有