http缓存提高性能

news/2024/7/8 3:37:33

秋招也算是正式结束了,现在整理一下笔记,当作巩固一下知识,也希望这个对大家有帮助

http 缓存 和 cdn 缓存可以说是面试必问的问题,竟然是必问的问题,那就总结全面一点~

 

http缓存机制

缓存分为服务端侧(server side,比如 Nginx、Apache)和客户端侧(client side,比如 web browser)。

服务端缓存又分为 代理服务器缓存 和 反向代理服务器缓存(也叫网关缓存,比如 Nginx反向代理、Squid等),其实广泛使用的 CDN 也是一种服务端缓存,目的都是让用户的请求走”捷径“,并且都是缓存图片、文件等静态资源。

浏览器缓存控制机制有两种:HTML Meta标签 vs. HTTP头信息

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

上述代码的作用是告诉浏览器当前页面不被缓存,每次访问都需要去服务器拉取。使用上很简单,但只有部分浏览器可以支持,而且所有缓存代理服务器都不支持,因为代理不解析HTML内容本身。

 

 


 

expires和cache control 都是指明资源的缓存有效期,如果有效,就(200 from cache)

  • expires :   http1.0,服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前可以直接从浏览器缓存存取数据(200 from cache),而无需再次请求,现在默认浏览器都是默认使用http 1.1,所以它的作用基本忽略。

缺点:返回的到期时间是服务器端的时间,如果客户端和服务器的时间相差很大,误差就很大。所以,在http 1.1开始,就使用cache-control:max-age 秒替代

<meta http-equiv="Cache-Control" content="max-age=7200" />
<meta http-equiv="Expires" content="Mon, 20 Jul 2009 23:00:00 GMT" />

 

  • cache-control  : http 1.1 ,与expires作用一致,都是指明资源的缓存有效期。不过cache-control选择更多,设置更细致,如果同时设置的话,优先级高于expires 

Public指示响应可被任何缓存区缓存。 

Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。 

no-cache指示请求或响应消息不能缓存,该选项并不是说可以设置”不缓存“,容易望文生义~ 

no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存,完全不存下來。 

max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 

min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 

max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

 

last-modified和Etag    判断之后(304 协商缓存)

  • last-modified指这个响应资源的最后修改时间。

当资源过期时(max-age/expires),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 (协商缓存)。If-Modified-Since能检查到的粒度是s级的

  • Etag :http 1.1,Last-Modified与ETag一起使用时,服务器会优先验证ETag。Etag仅仅是一个和文件相关的标记,可以是一个版本标记,比如说v1.0.0或者说"2e681a-6-5d044840"这么一串看起来 很神秘的编码。服务器判断发送过来的Etag和计算出来的Etag匹配,因此If-None-Match为False,不返回200,返回304

用户操作行为与缓存

img

浏览器中的操作对缓存的影响:

  • 强制刷新 – 当按下ctrl+F5来刷新页面的时候, 浏览器将绕过各种缓存(本地缓存和协商缓存), 直接让服务器返回最新的资源;
  • 普通刷新 – 当按下F5来刷新页面的时候,浏览器将绕过本地缓蹲来发送请求到服务器, 此时, 协商缓存是有效的
  • 回车或转向 – 当在地址栏上输入回车或者按下跳转按钮的时候, 所有缓存都生效

 


CDN (Content Delivery Network,内容分发网络)

CDN部署静态内容:指 JavaScript、CSS、图片、图标、Flash 等,不包括页面html。

--CDN是什么?

CDN是一组 分布在多个不同地理位置的Web服务器,用于更加有效地向用户发布内容。在优化性能时,
会根据距离的远近来选择。

1.将静态资源缓存到离用户很近的相同网络运营商的CDN节点上。

优点: 如果应用程序web服务器离用户更近,那么一个http请求的响应时间将缩短,另一方面,如果组件web服务器离用户更近,则多个http请求的响应时间将缩短

不同地区的用户会访问到离自己最近的相同网络线路上的CDN节点,当请求达到CDN节点后,节点会判断自己的内容缓存是否有效,一个地区内只要有一个用户先加载资源,在CDN中建立了缓存,该地区的其他后续用户都能因此而受益。

不同地区的用户访问同一个域名却能得到不同CDN节点的IP地址,这要依赖于CDN服务商提供的智能域名解析服务,浏览器发起域名查询时,这种智能DNS服务会根据用户IP计算并返回离它最近的同网络CDN节点IP,引导浏览器与此节点建立连接以获取资源。

 

2.加载静态资源使用与页面不同的域名[不是用独立的二级或三级域名,而是用独立的一级域名]

原理:当浏览器向服务器请求一个静态资源时,会先发送同域名下的 cookie,服务器对于这些 cookie 不会做任何处理。因此它们只是在毫无意义的消耗带宽。所以你应该确保对于静态内容的请求是无coockie的请求。

静态资源和主页面不同域,这样加载资源的http请求就不会带上主页面种的cookie等数据,减少了数据传输量。节省流量,提升上传效率

 

3.动静分离,减少核心服务器的压力

 

4.并发限制

原理:浏览器对同一个域名下的请求有并发的限制,(ie6为2个,其他为6个)

设置单独域名服务器,可以提升请求并发数,也就是令浏览器并行下载更多资源,提高站点性能。

 

5.方便复用--放在另一个服务器上,可以方便全局内其他产品的使用。

利于客户端的缓存,比如你打开了taobao.com,缓存了t.js文件,那么再打开tmall的时候,由于请求的是同一文件,就不用再下载了

 

 

 

 

 

 

 
 
 

转载于:https://www.cnblogs.com/beidan/p/cache.html


http://www.niftyadmin.cn/n/3569834.html

相关文章

基于matlab数字处理系统设计新颖,数字信号处理——基于数值计算

郑佳春、陈仅星、陈金西主编的《数字信号处理--基于数值计算》系统地介绍了数字信号处理的基本理论和算法&#xff0c;给出了利用MATLAB在计算机上实现数字信号处理系统分析、设计、计算的实例。全书包括三大部分&#xff1a;①离散时间信号和离散时间系统分析&#xff0c;主要…

跟着郝斌学数据结构(10)——链式二叉树

# include <stdio.h> # include <malloc.h> struct BTNode { char data; struct BTNode * pLchild; //p是指针 L是左 child是孩子 struct BTNode * pRchild; }; void PostTraverseBTree(struct BTNode * pT); struct BTNode * CreateBTree(void); void PreTra…

HTML5游戏开发实战之游戏自动保存进度

大概玩游戏的时候最讨厌的就是游戏没打完退出之后的状态了&#xff0c;但是在html5游戏上则不会出现这种情况。像site pinning特性, 试图给web浏览器web应用程序和常规的桌面应用同样的地位。 然而, 作为应用程序运行的网站想法太新了, 网页要维持客户端状态。 关闭Microsoft W…

Oracle的ha模式启停,Oracle 启停

Oracle 启停步骤一: 以管理员方式连接 oracle(1)oracle$ sqlplus /nolog; -- 不在 cmd 或者 terminal 当中暴露密码的登陆方式SQL> conn / as sysdba;(2)oracle$ sqlplus "/as sysdba" ; 或者 sqlplus / as sysdba;(3)oracle$ sqlplus scott/tiger; -- 非管理员用…

客户端和服务端对异常的不同处理态度【JFinal】

服务端后台管理这种如果代码中抛出异常&#xff0c;其Tx事务能起作用&#xff0c;但是在客户端与服务端交互的时候很多都是通过JSON或者XML格式&#xff0c;为了用户体验&#xff0c;成功的话就正常返回&#xff0c;不成功也应该给出失败的信息&#xff0c;而不是直接报505这种…

HTML5游戏开发实践之使用监控器

开发游戏的一个最大挑战是加入越来越多的游戏特性的同时能保持高帧率。好消息是, 浏览器比过去几年快了很多,HTML5开发游戏运行在恒定的60fps已经成为现实。这实属不易。 对于IE9,意味着要编写一个全新的JavaScript引擎, 使用多CPU内核和基于Direct2D的完全的硬件加速渲染管道。…

JSON的解析[Java-JSON、FastJSON、GSON]

Java-Json 一、 JSON &#xff08;JavaScript Object Notation&#xff09;一种简单的数据格式&#xff0c;比xml更轻巧。 Json建构于两种结构&#xff1a; 1、“名称/值”对的集合&#xff08;A collection of name/value pairs&#xff09;。不同的语言中&#xff0c…

CaSS中lisp命令不可用_干货在线 | 关于cass那些你不知道的秘密

南方数码地形地籍成图软件(简称CASS)是基于AutoCAD平台技术的GIS前端数据处理系统。CASS应用领域主要集中在下图的几个分支中&#xff0c;其中“行业应用”指CASS的一些行业应用版本&#xff0c;比如农村地籍版、勘测定界版、管线版等~小技巧画线&#xff1a;南方里面提供了强大…