缓存系列之一:buffer、cache与浏览器缓存
缓存系列之一:buffer、cache与浏览器缓存
一:缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较快的一方起到一个加速访问速度较慢的一方的作用,比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据,内存是保存CPU经常访问硬盘的数据,而且硬盘也有大小不一的缓存,甚至是物理服务器的raid 卡有也缓存,都是为了起到加速CPU 访问硬盘数据的目的,因为CPU的速度太快了,CPU需要的数据硬盘往往不能在短时间内满足CPU的需求,因此PCU缓存、内存、Raid 卡以及硬盘缓存就在一定程度上满足了CPU的数据需求,即CPU 从缓存读取数据可以大幅提高CPU的工作效率。
1.1:理解buffer和cache:
buffer:缓冲也叫写缓冲,一般用于写操作,可以将数据先写入内存在写入磁盘,buffer 一般用于写缓冲,用于解决不同介质的速度不一致的缓冲,先将数据临时写入到里自己最近的地方,以提高写入速度。
CPU会把数据线写到内存的磁盘缓冲区,然后就认为数据已经写入完成看,然后内核的线程在后面的时间在写入磁盘,所以服务器突然断电会丢失内存中的部分数据。
cache:缓存也叫读缓存,一般用于读操作,CPU读文件从内存读,如果内存没有就先从硬盘读到内存再读到CPU,将需要频繁读取的数据放在里自己最近的缓存区域,下次读取的时候即可快速读取。
1.2:cache的保存位置:
客户端:浏览器
内存:本地服务器、远程服务器
硬盘:本机硬盘、远程服务器硬盘
速度对比:
客户端浏览器-内存-远程内存-硬盘-远程硬盘
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:火狐浏览器的缓存位置:
2.2.2:文件的访问时间、最后修改时间和更改时间:
# stat index.php
File: ‘index.php’
Size: Blocks: IO Block: regular file
Device: fd01h/64769d Inode: Links:
Access: (/-rwxr-xr-x) Uid: ( / nginx) Gid: ( / nginx)
Access: -- ::03.046492759 + # 最后一次读取的时间
Modify: -- ::47.000000000 + # 最后一次更改内容导致block内容发生变化的时间
Change: -- ::35.872038074 + # 权限等发生更改导致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 可以根据后缀名判断加不加参数,即某些后缀的有参数有些后缀没有参数
缓存系列之一:buffer、cache与浏览器缓存的更多相关文章
- Buffer Cache(缓冲区缓存)篇:keep缓冲区池(保留池)
Buffer Cache可以有三个池 默认缓冲区池 keep缓冲区池 recycling缓冲区池 --保留池和回收池可以独立于sga中的其他缓存分配内存.创建表的时候可以在storage子句中使用b ...
- Buffer Cache(缓冲区缓存)篇:缓存区块大小
缓冲区缓存(Buffer Cache) Buffer Cache是SGA的一部分,保存最近从磁盘读取的或修改的(dml修改或添加)数据块.Buffer Cache的目的就是减少磁盘I/O,提高速度. ...
- 分布式系统缓存系列之guava cache
guava是google的一个开源java框架,其github地址是 https://github.com/google/guava.guava工程包含了若干被Google的 Java项目广泛依赖 ...
- ASP.NET Core :缓存系列(四):内存缓存 MemoryCache
System.Runtime.Caching/MemoryCache ICacheEntry 接口中的属性:具体设置过期时间 可以参考:微软文档ICacheEntry 接口 缓存基本使用 (一) 绝对 ...
- 浏览器缓存相关http头
近期看雅虎黄金34条,学习下优化站点性能的方法. 当中有一条:"为文件头指定Expires或Cache-Control",详细来说指对于静态内容:设置文件头过期时间Expires的 ...
- 浏览器缓存和Service Worker
浏览器缓存和Service Worker @billshooting 2018-05-06 字数 6175 Follow me on Github 标签: BOM 1. 传统的HTTP浏览器缓存策略 ...
- host缓存,浏览器缓存---解决host缓存带来的伤
1.缓存 缓存,对应工程师来讲简直太熟悉了,太方便了,省略到资源或数据的获取方式,直接缓存到离用户访问最快的地方,也降低服务器的压力,比如: (1)静态文件获取 服务器->cdn->本地磁 ...
- unity缓存和浏览器缓存
原地址:http://www.cnblogs.com/hisiqi/p/3203553.html <蒸汽之城>游戏中,为什么会黑屏?或者无法正常进入游戏? 我们在进行多项测试中发现少数用户 ...
- atitit。浏览器缓存机制 and 微信浏览器防止缓存的设计 attilax 总结
atitit.浏览器缓存机制 and 微信浏览器防止缓存的设计 attilax 总结 1. 缓存的一些机制 1 1.1. http 304 1 1.2. 浏览器刷新的处理机制 1 1.3. Expir ...
随机推荐
- SpringBoot系列: 与Spring Rest服务交互数据
不管是单体应用还是微服务应用, 现在都流行Restful风格, 下图是一个比较典型的使用rest的应用架构, 该应用不仅使用database数据源, 而且用到了一个Weather微服务, 另一方面, ...
- 简单回射程序之处理accept返回EINTR错误的服务器程序版本
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <errno.h> ...
- python-类型转化
s='1234' a=int(s) 字符串转换成整数 s=str(a) 整数转换成字符串
- qt5下载与安装,VS2017的环境配置
下载地址 http://download.qt.io/archive/qt/ 安装 选择安装路径 ,只有没有中文即可 二.Qt与VS2017相关联 1.打开VS2017,选择工具 - 拓展和更新 2 ...
- MySQL对表数据操作
一: 修改表信息 1.修改表名 alter table test_a rename to sys_app; 2.修改表注释 alter table sys_application comment '系 ...
- Ant使用指南
ant 使用指南 参考:http://www.cnblogs.com/hoojo/archive/2013/06/14/java_ant_project_target_task_run.html 一 ...
- Liunx/RHEL6.5 Oracle11 安装记录[缺少依赖包的解决方案]
1.将镜像文件挂,如/mnt # mount -o loop rhel-server-6.1-x86_64-dvd.iso /mnt#这一步其实有很多实现方法,如可以将镜像文件中的Packages文件 ...
- 简单重写容器vector
#pragma once #include <iostream> using namespace std; template<class T> class CMyVector ...
- day 12 - 1 装饰器进阶
装饰器进阶 装饰器的简单回顾 装饰器开发原则:开放封闭原则装饰器的作用:在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质:闭包函数 装饰器的模式 def wrapper(func): ...
- JAVA进阶2
间歇性混吃等死,持续性踌躇满志系列-------------第2天 1.父类子类继承(注:一个JAVA源文件中只能有一个public类,public 类的名字必须和这个编译单元的文件名完全相同,包括大 ...