缓存系列之一:buffer、cache与浏览器缓存php
一:缓存是为了调节速度不一致的两个或多个不一样的物质的速度,在中间对速度较快的一方起到一个加速访问速度较慢的一方的做用,好比CPU的一级、二级缓存是保存了CPU最近常常访问的数据,内存是保存CPU常常访问硬盘的数据,并且硬盘也有大小不一的缓存,甚至是物理服务器的raid 卡有也缓存,都是为了起到加速CPU 访问硬盘数据的目的,由于CPU的速度太快了,CPU须要的数据硬盘每每不能在短期内知足CPU的需求,所以PCU缓存、内存、Raid 卡以及硬盘缓存就在必定程度上知足了CPU的数据需求,即CPU 从缓存读取数据能够大幅提升CPU的工做效率。node
1.1:理解buffer和cache:
buffer:缓冲也叫写缓冲,通常用于写操做,能够将数据先写入内存在写入磁盘,buffer 通常用于写缓冲,用于解决不一样介质的速度不一致的缓冲,先将数据临时写入到里本身最近的地方,以提升写入速度。
CPU会把数据线写到内存的磁盘缓冲区,而后就认为数据已经写入完成看,而后内核的线程在后面的时间在写入磁盘,因此服务器忽然断电会丢失内存中的部分数据。
cache:缓存也叫读缓存,通常用于读操做,CPU读文件从内存读,若是内存没有就先从硬盘读到内存再读到CPU,将须要频繁读取的数据放在里本身最近的缓存区域,下次读取的时候便可快速读取。nginx
1.2:cache的保存位置:
客户端:浏览器
内存:本地服务器、远程服务器
硬盘:本机硬盘、远程服务器硬盘
速度对比:
客户端浏览器-内存-远程内存-硬盘-远程硬盘chrome
1.3:cache的特性:浏览器
1.过时时间
2.强制过时,源网站更新图片后CDN是不会更新的,须要强制是图片缓存过时
3.命中率,即缓存的读取命中率缓存
1.4:将内存的数据保存到硬盘,而后清空内存,可能有些内存的数据是进程死掉没法释放的:
#sync # 将缓冲区中的数据快速写入到硬盘
# cat /proc/sys/vm/drop_caches
0
#1是用来清空最近放问过的文件页面缓存
#2是用来清空文件节点缓存和目录项缓存
#3是用来清空1和2全部内容的缓存。服务器
二:用户层缓存:
2.1:DNS 缓存:
2.1.1:默认为60秒,即60秒以内在访问同一个域名就不在进行DNS解析:
查看chrome浏览器的DNS缓存:
chrome://net-internals/#dns网站
2.1.2:DNS 预获取,仅在HTML 5中支持,当一个页面中包含多个域名的时候浏览器会先尝试解析域名并进行缓存,以后再使用的时候便可直接只有不须要再进行DNS 解析:
2.2:浏览器缓存:
2.2.1:火狐浏览器的缓存位置:url
2.2.2:文件的访问时间、最后修改时间和更改时间:spa
# stat index.php File: ‘index.php’ Size: 4311 Blocks: 16 IO Block: 4096 regular file Device: fd01h/64769d Inode: 68497957 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 497/ nginx) Gid: ( 497/ nginx) Access: 2017-07-21 02:00:03.046492759 +0800 # 最后一次读取的时间 Modify: 2016-04-07 18:32:47.000000000 +0800 # 最后一次更改内容致使block内容发生变化的时间 Change: 2017-01-11 15:55:35.872038074 +0800 # 权限等发生更改致使inode发送变化的时间
2.2.3:缓存协商机制之最后修改时间:系统调用会获取文件的最后修改时间,若是没有发生变化就返回给浏览器304的状态码,表示没有发生变化,而后浏览器就使用的本地的缓存展现资源
2.2.4:缓存协商之Etag:
浏览器在返回的报文中包含一个etag的标记,而后浏览器将etag保存,再次收到Etag的时候会进行判断,若是Etag没有发生变化就使用本地缓存
2.2.5:缓存协商之过时时间,以上两种都须要发送请求,即无论资源是否过时都要发送请求进行协商,这样会消耗没必要要的时间,所以有了缓存的过时时间,即第一次请求资源的时候带一个资源的过时时间,默认为30天,当前这种方式使用的比表较多,可是没法保证客户的时间都是准确而且一致的,所以假如一个最大生存周期,使用用户本地的时间计算缓存数据是否超过多少天,下面的过时时间为2017年,可是缓存的最大生存周期计算为天等于691200秒即2天,过时时间以下:
最大生存周期,单位为秒,根据客户端的时间日后计算是否超出缓存天数
三:关于刷新:
3.1:在浏览器输入地址栏直接按回车:
浏览器的全部没有过时的数据直接使用本地缓存,即没有过时的数据不会发送缓存协商的请求。
3.2:按F5或者浏览器上的刷新按钮:
浏览器会在请求头部附加缓存协商报文,浏览器不能直接使用本地缓存,须要经过验证才可使用,可是过时时间没有超过日期的缓存不受影响,受影响的是最后修改时间和Etag。
3.3:ctrl+F5或者是按住ctrl+刷新,这是强制刷新,浏览器将发送全部的请求到服务器,不会使用本地缓存
3.4:如何让客户端获取最新的服务器数据资源:
3.4.1:更改资源名称,这样每次都得改,比较麻烦并且容易出错
3.4.2:增长时间戳,新版本的使用较新的时间戳,浏览器发现时间较新就会获取新的资源,例如xxx.js?20170724比xxx.js?20170101新
3.4.3:静态资源使用CDN要加参数,好比URL 能够带参数,带参数的话CND会对该url进行hash计算,当源url资源发送变化(故意的把参数更改,由于静态资源更新了,要求CND也更新)CDN 发现hash值不同就会进行更新,另外CDN 能够根据后缀名判断加不加参数,即某些后缀的有参数有些后缀没有参数