说说缓存那些事

用了两天的业余时间,研究了一下缓存的事情,不敢说完全掌握,还是把找的相关资料按照自己的理解整理一下~以供学习,俗话说,好脑子不如烂笔头,跟哪位前辈的重复了,欢迎批评指导,话不说多,步入正题

  我们说的缓存指的是可以自动保存常见http请求副本的http设备,有了缓存,我们便可以从本地(浏览器)获取,而不需要在从服务器端更新了;

  缓存的分类,网上众说纷纭,但是大致有以下几:,浏览器缓存,CDN缓存,数据库缓存,代理服务器缓存;但本文说的是浏览器缓存.

  `我们有时候有个明显的感觉就是,打开某个网站的时候,第一次会感觉慢和卡,第二次会快得多;当然,没有感觉到的话,也可能是网速比较好,感觉到了就是缓存再起作用,第一次请求的时候,下载的数据比较多,第二次往后有缓存(本地副本),就会节约响应时间,

  下面列举一下使用缓存(本文指的是浏览器缓存,下文不在赘述)的优点:

  1,对用户来说,节约流量,提高了体验性能

  2,对网站开发来说,节省带宽,减少冗余的数据传输,另一方面,也降低服务器的压力

一,缓存的示意图如下:

  第一次请求的时候是这样的

也不需要过多的解释了,毕竟第一次,啥都要从服务器端获取

2.以后的请求如下图所示

对着流程简单说一下,首先会判断是否有缓存,没有的话,跟第一次一样,去服务器获取;

  有的情况下,就要判断缓存时间是否过期,过期了,还要到服务器获取,

  没有过期,执行接下来的一步,向服务器发送带有If-None-Match,判断返回的值和ETag是否相等,相等,说明可用缓存,

  不相等,向服务器发送带有Ih-Modified-Since,判断和Last-Modified(最后修改时间)两者的时间大小,在决定是使用缓存还是更新.看的懵逼没事,先记住大概流程,接下来一一讲解

二.相关名词解释

1.如何判断时候过期

  原来用的是Expires策略,浏览器可以直接从浏览器缓存读取数据,而无需再次请求,它的值对应一个GMT,来告诉浏览器资源缓存过期时间,如果还没过该时间点则不发请求。

  例如下面的例子,这是京东的首页里找的一个,时间都干到2027年了,现在的时间是2017年7月20,肯定还没到失效时间,so是304,使用本地缓存,也就是说在失效时间之内,一直使用缓存,除非把缓存删了

但是这是http1.0的东西,现在使用的是http1.1的,这个可以忽略了因为这个是获取的本地的时间,我们改动的话,会出现问题,现在都用Cache-control了

cache-control策略有的地方也叫新鲜度限值

这个和上面说的expires效果是一样的,最大时间,

用来控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。

只不过Cache-Control的选择更多,设置更细致,如果同时设置的话,其优先级高于Expires。

Cache-Control可拥有如下值:

Public
指定响应会被缓存,并且在多用户间共享。

Private
响应只作为私有的缓存(见下图),不能在用户间共享。如果要求HTTP认证,响应会自动设置为private。。缓存只开放给某些特定的用户,比如服务器的用户,其他用户则不能缓存这些数据。

no-cache
指定不缓存响应,表明资源不进行缓存,

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

max-age
指示客户端该端时间内缓存都是最新的。单位为秒,就是在这个时间内,不会请求数据了,一直用的就是缓存。比如:Cache-Control:max-age=3600 表示60分钟之后过期,在这60分钟期间不会更新。

min-fresh 
指示客户端希望获取一个在小于指定的时间内被更新过的资源,单位为秒:例如:Cache-Control:min-fresh =120 。向服务器获取2分钟内被更新过的资源

max-stale
指示客户端可以接收超出超时期间的响应消息。例如:Cache-Control:max-stale =3600 ,向服务器获取超过缓存时间2分钟的资源..

2.Etag和If-None-Match

下面说的东西,包括Etag和If-None-Match,是在缓存时间已经失效的情况下,即Cache-Control:mac-age = 0 的情况下,

会判断Etag和If-None-Match两者是否相等,ETag是根据实体内容生成的hash字符串,具体是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的,

如果If-None-Match返回的和Etag相等的话,就返回304,可以使用缓存的资源,文件没有被改动.具体如下

3.Last-Modified和If-Modified-Since

在多说一下,这个也是在缓存时间已经失效,即Cache-Control:mac-age = 0 的情况下,而且上面的Etag和If-None-Match不相等的情况下;

  Last-Modified指的是文件上一次被修改的时间(可以理解为服务器端的),, 会带着 If-Modified-Since(本地的)返回的时间,,本地的时间大于等于服务器端的时间的花,说明资源没有被改动过接着用缓存的,否则就要更新,从新发送web请求了,如果感觉拗口的话,贴一下参考的原话,

当资源过期时(也就是 Cache-Control:max-age=0,),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。web服

务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若Last-Modified的时间较新,说明最后修改时间较新,说明资源又被改动过,则响应整

的资源重新从服务器读取,而不是读取缓存,返回200状态吗;若If-Modified-Since的时间比Last-Modified新或者相等,说明服务器的内容没有更新,直接读取缓存即可,

返回304状态码,告知浏览器继续使用所保存的cache。

另外需要说明的是: cache-control      .Etag和If-None-Match   Etag和If-None-Match三者的权重是从左到右越来越小的;

还有一点需要说明的是,我们说的缓存~基本上都是GET方式的,像POST之类的通常情况下是不会进行缓存的;

  说了这么多,缓存是好的,可以节约资源,减少服务器的压力,但是,设置太长的缓存时间的话,又不能及时的更新资源,具体如何取舍把握,还要视具体情况再说.

时间: 2024-12-15 10:05:20

说说缓存那些事的相关文章

缓存那些事-zz

https://tech.meituan.com/cache_about.html 前言 一般而言,现在互联网应用(网站或App)的整体流程,可以概括如图1所示,用户请求从界面(浏览器或App界面)到网络转发.应用服务再到存储(数据库或文件系统),然后返回到界面呈现内容. 随着互联网的普及,内容信息越来越复杂,用户数和访问量越来越大,我们的应用需要支撑更多的并发量,同时我们的应用服务器和数据库服务器所做的计算也越来越多.但是往往我们的应用服务器资源是有限的,且技术变革是缓慢的,数据库每秒能接受的

亿级请求下多级缓存那些事

本文转自:中生代技术 什么是多级缓存   所谓多级缓存,即在整个系统架构的不同系统层级进行数据缓存,以提升访问效率,这也是应用最广的方案之一.我们应用的整体架构如图1所示: 图1 多级缓存方案 整体流程如上图所示: 1)首先接入Nginx将请求负载均衡到应用Nginx,此处常用的负载均衡算法是轮询或者一致性哈希,轮询可以使服务器的请求更加均衡,而一致性哈希可以提升应用Nginx的缓存命中率,相对于轮询,一致性哈希会存在单机热点问题,一种解决办法是热点直接推送到接入层Nginx,一种办法是设置一个

HTTP缓存 1.0 vs 1.1

在“使用ETag跟踪用户”中有一点被忽略了,因为要用这张小图统计统计uv, 所以要求浏览器必须每次都要发送这个图片的请求.这需要服务器对图片的缓存策略做设置. http/1.0 和 http/1.1 的缓存策略不同,浏览器缓存这事看似简单,实际上很容易模棱两可,造成疏忽. HTTP/1.0 协议文档: https://www.w3.org/Protocols/HTTP/1.0/spec.html 相关字段: Date: 服务器响应的时间 Expires: 资源过期时间 Last-Modified

CDN缓存(转载)

CDN缓存那些事(转载) 原文地址:http://bbs.qcloud.com/forum.php?mod=viewthread&tid=3775 注:原文全文复制,仅仅作为自己下次学习备份,勿喷,谢谢- CDN是什么? 谈到CDN的作用,可以用8年买火车票的经历来形象比喻: 8年前,还没有火车票代售点一说,12306.cn更是无从说起.那时候火车票还只能在火车站的售票大厅购买,而我所住的小县城并不通火车,火车票都要去市里的火车站购买,而从县城到市里,来回就是4个小时车程,简直就是浪费生命.后来

透过浏览器看HTTP缓存[转载]

http://www.admin10000.com/document/6299.html 作为前端开发人员,对于我们的站点或应用的缓存机制我们能做的似乎不多,但这些却是与我们关注的性能息息相关的部分,站点没有做任何缓存机制,我们的页面可能会因为资源的下载和渲染变得很慢,但大家都知道去找前端去解决页面慢的问题而不会去找服务端的开发人员.因此,了解相关的缓存机制和充分的利用它似乎就变得必不可少. web端的缓存机制其实有多种,我在这里只是学习和整理了以浏览器为载体的HTTP缓存机制,看看它是如何工作

透过浏览器看HTTP缓存

作为前端开发人员,对于我们的站点或应用的缓存机制我们能做的似乎不多,但这些却是与我们关注的性能息息相关的部分,站点没有做任何缓存机制,我们的页面可能会因为资源的下载和渲染变得很慢,但大家都知道去找前端去解决页面慢的问题而不会去找服务端的开发人员.因此,了解相关的缓存机制和充分的利用它似乎就变得必不可少. web端的缓存机制其实有多种,我在这里只是学习和整理了以浏览器为载体的HTTP缓存机制,看看它是如何工作的. 一.web缓存的种类 1.1 数据库缓存 我们可能听说过memcached,它就是一

以浏览器为载体的缓存机制

1.web缓存的种类: (1)数据库的缓存 我们可能听说过memcached(高性能的缓存系统),它就是一种数据库层面的缓存方案,数据库缓存是指,当web应用的关系比较复杂,数据库中的表很多的时候,如果进行频繁的数据库查询,很容易导致数据库不堪重负.为了提供查询的性能,将查询的数据放在能存中缓存,下次查询的时候,直接从内存直接返回.效率高. (2)CDN缓存 CDN缓存一般是由网站管理员自己部署,为了让他们的网站更容易扩展获得更好的性能,通常情况下,web向CDN网关发起web请求,网关服务器后

微服务架构下静态数据通用缓存机制

在分布式系统中,特别是最近很火的微服务架构下,有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案,这篇文章将结合一些实际的研发经验,尝试理清其中存在的关键问题以及探寻通用的解决之道. 什么是静态数据 这里静态数据是指不经常发生变化或者变化频率比较低的数据,比如车型库.用户基本信息.车辆基本信息等,车型库这种可能每个月会更新一次,用户和车辆基本信息的变化来源于用户注册.修改,这个操作的频率相对也是比较低的. 另外这类数据的另一个特点是要求准确率和实时性都比较高,不能出现丢失.错误,以及

静态数据通用缓存机制

静态数据通用缓存机制 http://blog.bossma.cn/architecture/microservice-business-static-data-universal-cache-mechanism/ 微服务架构下静态数据通用缓存机制 在分布式系统中,特别是最近很火的微服务架构下,有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案,这篇文章将结合一些实际的研发经验,尝试理清其中存在的关键问题以及探寻通用的解决之道. 什么是静态数据 这里静态数据是指不经常发生变化或者变化频