1.缓存

缓存,对应工程师来讲简直太熟悉了,太方便了,省略到资源或数据的获取方式,直接缓存到离用户访问最快的地方,也降低服务器的压力,比如:

(1)静态文件获取

服务器->cdn->本地磁盘->本地内存

(2)数据获取

数据库->内存型数据库

(3)host 缓存

主域名服务器->顶级域名服务器->根域名服务器->网络服务提供商缓存->路由器缓存->系统缓存->浏览器缓存

缓存的好处不言而喻,提升用户的访问速度,降低服务端的压力,问题就是:多份数据放在不同的地方,缓存数据一致性问题很关键。本次主要就host缓存中最常用的浏览器缓存讲讲。

2.说说浏览器缓存

名词解析:

(1)expires 和 cache-control 的区别:

相同:都是用来判断该资源的本地缓存的过期时间

expires:是绝对时间,所以如果服务器和本地时间不一致,可能都会有问题

cache-control:是相对时间,兼容性更好

2.1 浏览器缓存分类

浏览器缓存分为强缓存和协商缓存,匹配缓存的流程:

(1)浏览器发送请求前,根据请求头的 expires 和 cache-control 判断是否命中强缓存策略,如果命中,直接从缓存获取资源,并不会发送请求,响应码为:200(from memory cache 或者 from disk cache),如果没有命中,则进入下一步。

(2)没有命中强缓存规则,浏览器会发送请求,根据请求头的 last-modified 或 etag 判断是否命中协商缓存,如果命中,服务器并不会返回这个资源,而是返回一个 httpCode(304),浏览器根据这个 httpCode 从本地缓存加载文件。

(3)如果前两步都没有命中,则直接从服务端获取资源,并缓存在本地

2.2强缓存

2.2.1强缓存原理:

强缓存需要服务端设置 expires 和 cache-control。

(1)第一次从服务器请求资源,服务器返回资源时,在 respone 的 header 加上 cache-control

(2)接收到资源后,会把资源连同所有 response header 一起缓存下来(所以缓存命中的请求返回的header是来自缓存的header)

(3)再次访问这个资源时,先从缓存中找,找到后如果请求时间在缓存中设置的 cache-control 之前,则直接从缓存中加载文件

(4)如果缓存没有命中,浏览器直接从服务器加载资源时,Cache-Control 在重新加载的时候会被更新

2.2.2 强缓存分类

(1)from disk cache:缓存在硬盘,浏览器关闭,缓存还在

(2)from memory cache:缓存在内存,浏览器关闭,缓存清除

2.3协商缓存

浏览器没有命中强缓存,就会发送请求到服务器,验证是否命中协商缓存,如果命中,则服务其不会返回文件,返回 httpCode(304 not modified),浏览器从本地缓存加载文件

2.3.1 协商缓存管理

协商缓存是利用的是【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】这两对Header来管理的。

(1)发送请求服务器文件后,response header 里面增加了 Last-Modified,表示最新修改时间

(2)当重新发送请求获取此文件时,request header 带上 If-Modified-Since,表示 上次请求缓存在本地文件里面的 response header 里面 Last-Modified

(3)服务器收到请求后,根据请求头 If-Modified-Since 跟服务器文件的最新修改时间做对比,没有变化,返回 httpCode(304 not modified),response header 中不会再添加 Last-Modified 的header,这就表示命中了协商缓存

(4)如果协商缓存没有命中,浏览器直接从服务器加载资源时,Last-Modified Header 在重新加载的时候会被更新,下次请求时,If-Modified-Since 会变成上次返回的 Last-Modified 值。

改进:存在服务器文件内容发生修改,但是修改时间却没有改变,所以产生了 etag,根据文件内容生成一个字符串,文件内容发生变化,etag就会改变,不再依赖于修改时间。

3.host缓存带来的问题和原因

1.网站换机器了,缓存的 ip 和 域名 未及时发生变更,导致网站访问不了

reason: dns缓存有一定的失效时间,如果dns缓存的是你的服务器的真实ip和域名映射,如果服务器不可用了,上面看到的host缓存链路,基本上都不会失效缓存,就导致访问不了

resolve: 直接缓存 域名 和 服务器,就必须保证 服务器永远可用,否则就会导致部分用户用不了,所以我们一般将 域名 绑定到代理服务器,代理服务器只负责接受、转发请求和负载均衡,不负责应用发布、升级等,所以代理服务器几乎不会挂,所以大大解决了 dns 缓存带来的不可访问的问题

2.修改了host,用浏览器访问依旧访问到改之前的ip上

reason:这个一般就是 浏览器缓存 或者 系统缓存。

resolve:清除浏览器缓存或者系统缓存即可

3.修改了host,访问部分资源是旧的资源,部分资源是新的资源

reason:新版本浏览器,很多都开启了内存缓存,会将部分数据或者文件缓存到本地内存中,但修改了host 还是访问的是缓存到内存的数据

resolve:清除掉浏览器内存和内存缓存。

4.一招清理浏览器缓存

4.1 chrome浏览器

(1)访问: chrome://net-internals/#dns

(2)点击右上角倒三角:clear cache ,即可清除掉 域名 和 ip的缓存

(3)点击右上角倒三角:flush sockets,即可关闭掉已经打开的sockets

(4)再次访问域名,即可访问到正确的ip和资源

如何根治关闭掉浏览器缓存:

(1)打开浏览器 “检查”

(2)检查框右上角三个点,选择 more tools

(3)选择 network condition

(4)选择 disable cache

4.2 safari 浏览器

关闭浏览器缓存:

原理:发送请求时,请求头带上了 no-cache

host缓存,浏览器缓存---解决host缓存带来的伤的更多相关文章

  1. 浏览器window产生的缓存九种解决办法

    浏览器缓存(Browser Caching)是浏览器端保存数据用于快速读取或避免重复资源请求的优化机制,有效的缓存使用可以避免重复的网络请求和浏览器快速地读取本地数据,整体上加速网页展示给用户.浏览器 ...

  2. 解决$.getJSON在IE浏览器下出现数据缓存,第一次访问某个后台路径之后,再次访问该路径不再走后台的方法。

    最近写代码的时候遇到一个小问题,我用的是火狐,项目里测试人员用的是IE,当用jquery的getjson函数从后台获取数据的时候,IE浏览器会自动设置缓存,如果此时你对数据进行修改的时候刷新页面,IE ...

  3. angular js 在ie11 下的get请求缓存问题的解决办法

    使用angularjs 1.x开发的应用在ie11 下回碰到各种怪异的情况:一般表现在:卡,慢,丑. 还有另外一种情况,就是:get请求被缓存,导致页面数据没有刷新.今天我们就来解决这个问题. 几行代 ...

  4. 缓存(CDN缓存,浏览器(客户端)缓存)

    1.什么是缓存? 缓存是一种数据结构,用于快速查找以及执行的操作结果.因此,如果一个操作执行起来很慢,对于常用的输入数据就可以将操作的结果缓存,并在下次调用该操作时使用缓存的数据. 缓存是一个到处都存 ...

  5. 浏览器 HTTP 协议缓存机制详解--网络缓存决策机制流程图

    1.缓存的分类 2.浏览器缓存机制详解 2.1 HTML Meta标签控制缓存 2.2 HTTP头信息控制缓存 2.2.1 浏览器请求流程 2.2.2 几个重要概念解释 3.用户行为与缓存 4.Ref ...

  6. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)

    一.Django中的缓存: 前戏: 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一 ...

  7. 解决iframe缓存机制导致页面不清除缓存不刷新页面的bug

    在使用iframe时,已有页面嵌套了一个iframe页面,当这个页面提交后再次跳转到本页面时,原本iframe内的页面应该刷新数据的,结果未刷新,需要清除缓存后才刷新. 解决方案: var fresh ...

  8. jquery面试题里 缓存问题如何解决?

    jquery面试题里 缓存问题如何解决? 如果直接用jQuery里的$.ajax()方法的话,去除缓存很简单,只需要配置一下缓存属性cache为false,但如果想要简单写法getJSON(),去除缓 ...

  9. redis缓存雪崩,缓存穿透,缓存击穿的解决方法

    一.缓存雪崩 缓存雪崩表示在某一时间段,缓存集中失效,导致请求全部走数据库,有可能搞垮数据库,使整个服务瘫痪. 使缓存集中失效的原因: 1.redis服务器挂掉了. 2.对缓存数据设置了相同的过期时间 ...

随机推荐

  1. powershell命令教程

    启动 powershell #字符串操作 对象操作 "hello".Length #进程操作 PS C:\> notepad PS C:\> $process=get- ...

  2. 一个BADI创建了两个实施会有什么问题呢?

    BADI :LE_SHP_DELIVERY_PROC 创建了两个实施,会导致什么问题呢? 前台测试  调试 VL01N 进了这个断点:ZCL_IM_IM_LE_SHP_DELIV_001 F8之后  ...

  3. JVM-类加载子系统

    类的生命周期 1.加载 将.class二进制字节流流从磁盘读到内存中(通过文件的全限定名读取) 2.连接 2.1验证:验证字节码文件的正确性 2.2准备:给类的静态变量分配内存,并赋予默认值(比如 i ...

  4. CockroachDB学习笔记——[译]为什么Go语言是CockroachDB的正确选择

    原文链接:https://www.cockroachlabs.com/blog/why-go-was-the-right-choice-for-cockroachdb/ 原作者:Jessica Edw ...

  5. IOS上的 Audio Memos SE 如何分享和传输录音到电脑?

    Audio Memos SE 是 Audio Memos 的精简版 ,顾名思义就是少了很多实用功能.当初下载这个就是因为广告比较少一些,没有全屏幕的广告. 好了,录了音,想分享和传到电脑要怎么弄呢? ...

  6. Python随笔日记(1)

    Python学习 1.安装python .之后在Windows中配置环境变量(计算机\属性\高级系统设置\环境变量\系统变量\path后加入 :路径) 2.注意变量的命名的规则 字母.数字.下划线 p ...

  7. 配置zabbix监控windows,cmd运行报错cannot connect to Service Manager: [0x00000005]

    错误原因: cmd运行没有管理员权限 解决: 找到cmd.exe的位置C:\Windows\System32,选中--右键--使用管理员身份运行 再通过cmd进入到zabbix_agentd文件夹进行 ...

  8. CSRF利用

    使用burpsuite的csrf poc选项,可以生成HTML代码 json CSRF flash + 307跳转 https://github.com/sp1d3r/swf_json_csrf

  9. winform 更新文件上传(一)

    using Common; using DevExpress.XtraEditors; using FileModel.UpLoad; using System; using System.Colle ...

  10. 【ARM-Linux开发】Linux内存管理:ARM Memory Layout以及mmu配置

    原文:Linux内存管理:ARM Memory Layout以及mmu配置 在内核进行page初始化以及mmu配置之前,首先需要知道整个memory map. 1. ARM Memory Layout ...