16 九 2009, 9:12上午
cache:
by

发表点儿看法吧

缓存做的事情

 

首先从最基本的缓存机制开始,Alice第一次访问网站向Cache发送了请求,cache没有Alice要的数据.于是又向后端(Backend)发现请求,从服务器上获取了数据以后,沿着原路返回。

image

当网站数据较少的时候,上面的模型已经足够了。但是数据总是在膨胀的~~~

为了加速,我们希望缓存(cache)中能存一些用户常访问的数据。如时我们开始在http请求中加入Cache-Control:max-age这个参数。当第一个用户访问这个数据后,数据就会在缓存中缓存一个设定的时间。

image

 

当后来的用户在访问这个数据的时间,发现这个数据就在缓存中直接返回,就不在去后端服务器上取数据了。某个数据的访问量大时,它的max-age总是没有过期,于是就总在缓存中,大大提高了数据的命中率,和传输效率。

image

到这里,这种过期机制(Expiration) 冒似已经很理想了。
但是,在一个动态更新的网站里,这些显然还不够。

当数据,被缓存在cache里的时候Backend上这个数据的值已经发生了改变。或者说产生了新的内容,用户(Bob)怎么才能得到新的数据呢。Bob已经从cache中直接回去了.
于是我们需要验证机制(validation),在http头里面加上Last-Modified和E-tag

image

当Alice第一次访问这个数据的时候,http请求里面包括了这个数据最后修改的日期(Last-Modified),和有一个实体标记(Entity-Tag),这个是唯一的,随机的。

image

当第二个用户(Bob)来访问的时候,发出的请求If-Modified-Since和If-Node-Match两个值和刚才Alice访问时的Last-Modified,E-tag一致的时候。服务器直接给缓存返回一个304 Not Modified.这样缓存知道服务器上的数据没有改动就直接从缓存中直接读取数据返回给用户。

Expiration和validation是http缓存机制的基础,两者可以一起用。Alice第一个访问这个数据。

image

Bob接着访问,因为缓存还是新的,没有超期,直接从缓存返回。

image 

Carol跟着Bob访问,这个数据已经超期过了60秒。Cache就向Backend询问有没有新数据,Backend返回304 not modified.同时更新Expiration.Cache中对这个数据进行了续期。

image

 
  • 我在说

  • 我在看

  • 新文章

  • 文章归档