一、系统缓存
1.1 buffer 与 cache
buffer:缓冲也叫写缓冲,一般用于写操作,可以将数据先写入内存中的buffer再写入磁盘,用于解决不同介质的速度不一致的缓冲,先将数据临时写入到里自己最近的地方,以提高写入速度,CPU会把数据先写到内存的磁盘缓冲区,然后就认为数据已经写入完成看,然后由内核在后续的时间在写入磁盘,所以服务器突然断电会丢失内存中的部分数据。
cache:缓存也叫读缓存,一般用于读操作,内存将CPU需要频繁读取的数据放在cache缓存,下次CPU读取的时候即可快速读取。
1.2 cache保存的位置
客户端:浏览器
内存:本地服务器、远端服务器
硬盘:本机硬盘、远端服务器硬盘
1.3 cache的有效时间
自动过期:给缓存的数据加上有效时间,超出时间后自动过期删除
过期时间:强制过期,源网站更新图片后CDN是不会更新的,需要强制是图片缓存过期 一般网站更新要刷新CDN
命中率:即缓存的读取命中率
二、用户层缓存
2.1 DNS缓存
默认为60秒,即60秒之内在访问同一个域名就不在进行DNS解析
查看chrome浏览器的DNS缓存,URL:chrome://net-internals/#dns
查看火狐浏览器的DNS缓存,URL:about:cache
2.2 浏览器缓存机制
2.2.1匹配最后修改时间
浏览器第一次访问网站时,会获取文件的最后修改时间;
浏览器第二次访问网站时,会去匹配文件的最后修改时间;
如果文件的最后修改时间没有发生变化,就返回给浏览器304的状态码,然后浏览器就使用的本地的缓存展示资源。
2.2.2Etag标记
该功能可以基于Nginx的etag on开启。
第一次发送请求之后,会将response响应头部的Etag标记保存到本地。
第二次发送请求之后,收到Etag会进行判断,如果Etag没有发生变化就使用本地缓存。
2.2.3过期时间
以上两种都需要发送第二次请求,这样会消耗不必要的时间,因此有了缓存的过期时间。
第一次请求资源的时候带一个资源的过期时间,默认为30天,当前这种方式使用的比表较多,但是无法保证客户的时间都是准确并且一致的,因此会加入一个最大生存周期,使用用户本地的时间计算缓存数据是否超过多少天,下面的过期时间为2027年,但是缓存的最大生存周期计算为天等于3650天即10年。
一般只有变化比较小的图片,时间才会设置长一些。如果有CDN服务,需要刷新一下。
三、CDN缓存
3.1 什么是CDN
内容分发网络(Content Delivery Network),通过将服务内容分发至全网加速节点,利用全球调度系统使用户能够就近获取,有效降低访问延迟,提升服务可用性。
第一:降低机房的使用带宽,因为很多资源通过CDN就直接返回用户了。
第二:解决不同运营商之间的互联,因为可以让联通的网络访问联通让电信的网络访问电信,起到加速用户访问的目的。
第三:解决用户访问的地域问题,就近返回用户资源。
百度CDN:https://cloud.baidu.com/product/cdn.html
阿里CDN:https://www.aliyun.com/product/cdn?spm=5176.8269123.416540.50.728y8n
腾讯CDN:https://www.qcloud.com/product/cdn
3.2 用户请求CDN流程
提前对静态内容进行预缓存,避免大量的请求回源,导致主站网络带宽被打满而导致数据无法更新,另外CDN可以将数据根据访问的热度不同而进行不同级别的缓存,例如访问量最高的资源访问CDN 边缘节点的内存,其次的放在SSD或者SATA,再其次的放在云存储,这样兼顾了速度与成本。
3.3 CDN主要优势
提前对静态内容进行预缓存,避免大量的请求回源,导致主站网络带宽被打满而导致数据无法更新,另外CDN可以将数据根据访问的热度不同而进行不同级别的缓存,例如访问量最高的资源访问CDN 边缘节点的内存,其次的放在SSD或者SATA,再其次的放在云存储,这样兼顾了速度与成本。缓存-缓存到最快的地方如内存,缓存的数据准确命中率高,访问速度就快。
调度准确-将用户调度到最近的边缘节点
性能优化-CDN 专门用于缓存响应速度快
安全相关-抵御攻击
节省带宽:由于用户请求由边缘节点响应,因此大幅降低到源站带宽。
四、应用层缓存
Nginx、Tomcat等web服务可以设置应用缓存以加速响应用户请求。
有些解释性语言比如PHP/Python/Java不能直接运行,需要先编译成字节码,但字节码需要解释器解释为机器码之后才能执行,因此字节码也是一种缓存。
(解释性语言—>编译字节码(缓存)—>解释器解释为机器码—>执行)
当程序代码上线后字节码没有更新的现象,需要先清理缓存。
五、其他层面的缓存
5.1 CPU缓存
CPU缓存(L1的数据缓存和L1的指令缓存)、二级缓存、三级缓存(CPU共享缓存)
5.2 Session 与 Cookie
Cookie是访问某些网站以后在本地存储的一些网站相关的信息,比如加密后的账户名密码等信息。
cookie可以实现每次登录直接被信任。
session称为会话信息,位于web服务器上,主要负责访问者与网站之间的交互,当浏览器请求http地址时,可以基于之前的session实现会话保持、session共享等。
session可以实现服务器识别用户,同一个session说明同一个用户。
第一次登录是没有session信息的,服务端会把session写入缓存服务器,作为session缓存共享。
cookie与session的区别:
1、Cookie以文本文件格式存储在浏览器中,而session存储在服务端(memcached或redis)。
2、cookie的存储限制了数据量,只允许4KB,而session是无限制的。
3、cookie包含在每一个客户端请求报文中,因此容易被人捕获。
4、cookie和session都可以设置过期时间。