著论准过秦,作赋拟子虚。这篇文章主要讲述缓存技术和用户层缓存原理相关的知识,希望能为你提供帮助。
缓存cache互联网应用领域,提到缓存为王
cache为了调节速度不一致的两个或多个不同的物质的速度,置于中间,可以实现速度较快的一方加速访问速度较慢的一方的作用。
buffer与cache buffer:缓冲,也叫写缓冲,一般用于写操作,可以将数据先写入内存在写入磁盘,buffer 一般用于写缓度,用于解决不同介质的速度不一致的缓冲,先将数据临时写入到里自己最近的地方,以提高写入速CPU会把数据先写到内存的磁盘缓冲区,然后应用认为数据已经写入完成,然后由内核在后续的时间再写入磁盘,所以服务器突然断电会丢失内存中的部分数据
cache:缓存,也叫读缓存,一般用于读操作,CPU读文件从内存读,如果内存没有,就先从硬盘读到内存
缓存保存位置及分层结构?
cache的特性
自动过期:给缓存的数据加上有效时间,超出时间后自动过期删除
强制过期:源网站更新图片后CDN是不会更新的,需要强制是图片缓存过期 ,通过CDN管理后台实现
命中率:即缓存的读取命中率
用户层缓存
1、DNS缓存:浏览器的DNS缓存默认为60秒,即60秒之内在访问同一个域名就不在进行DNS解析
2、浏览器缓存过期机制:最后修改时间 last-modified(需要向服务器发送请求)
如果带有 Last-Modified ,下一次发送Http 请求时,将会自动携带此时间值的 If-modified-since 的 Http请求Header 。
如果没有过期,将会收到 304 的响应,从缓存中读取。
【缓存技术和用户层缓存原理】浏览器发起请求后,WEB服务器会将服务器端的文件的最后修改时间和本地浏览器缓存中的文件时间相比,如果没有发生变化就返回给浏览器304的状态码,表示没有发生变化,然后浏览器就使用的本地的,缓存展示资源,如果变化,则重服务器发送变化的新资源
3、Etag 标记(需要向服务器发送请求)
Etag 是 Http 响应报文Header 字段, 代表资源的标签,在服务器端生成。如果响应报文中的资源带有Etag ,下一次发送请求时自动携带 If-None-Match 首部字段指定此Etag的值,服务器判断如果 Etag没有变化将收到 304 的响应,从缓存中读取。
4、过期时间 expires 和 Cache-Control
以上两种都需要发送请求,即不管资源是否过期都要发送请求进行协商,这样会消耗不必要的时间,因此有了缓存的过期时间
Expire 是 Http响应Header, 代表资源的过期时间,由服务器段设置。如果带有 Expire ,则在 Expire 过期前不会发生 Http 请求,直接从缓存中读取。但当用户执行 F5 强制刷新例外
5、Last-Modified,Etag,Expire判断流程图
通常 Last-Modified,Etag,Expire 是一起混合使用的
特别是 Last-Modified 和 Expire 经常一起使用,因为 Expire 可以让浏览器完全不发起 Http 请求,而当浏览器强制 F5 的时候又有 Last-Modified ,这样就很好的达到了浏览器段缓存的效果。
Etag 和 Expire 一起使用时,先判断 Expire ,如果已经过期,再发起 Http 请求,如果 Etag 变化了,则返回新资源的 200 响应。如果 Etag 没有变化,则返回 304 的缓存响应。
Last-Modified,Etag,Expires 三个同时使用时。先判断 Expire ,如果过期,则然后发送 Http 请求,服务器先判断 last-modified ,再判断 Etag ,必须都没有过期,才能返回 304 响应。
cookie 和 session
Cookie是访问某些网站以后在本地存储的一些网站相关的信息,下次再访问的时候减少一些步骤,比如加密后的账户名password等信息
Cookies是服务器在客户端浏览器上存储的小段文本并随每一个请求发送至同一个服务器,是一种实现客户端保持状态的方案。
session称为会话信息,位于web服务器上,主要负责访问者与网站之间的交互,当浏览器请求http地址时,可以基于之前的session实现会话保持、session共享等
推荐阅读
- 生成10个随机数保存于数组中,并找出其最大值和最小值
- 采用冒泡算法对数组进行升序或降序排序
- 总结十个Python 字典用法的使用技巧
- 阿里编程规范(精简版)#yyds干货盘点#
- 总结查看系统负载的几种命令和top命令的指标
- 简单介绍使用Nginx限制百度蜘蛛频繁抓取的问题
- C#中的Hashtable和Dictionary有什么区别()
- Go和Python编程语言之间有什么区别()
- C,C++,Java中的for和do-while循环之间的区别