<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code Name: Stave &#187; performance</title>
	<atom:link href="http://blog.aloo.cn/tag/performance/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aloo.cn</link>
	<description>All Coming</description>
	<lastBuildDate>Mon, 06 Sep 2010 18:40:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>缓存做的事情</title>
		<link>http://blog.aloo.cn/2009/09/%e7%bc%93%e5%ad%98%e5%81%9a%e7%9a%84%e4%ba%8b%e6%83%85/</link>
		<comments>http://blog.aloo.cn/2009/09/%e7%bc%93%e5%ad%98%e5%81%9a%e7%9a%84%e4%ba%8b%e6%83%85/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 17:12:55 +0000</pubDate>
		<dc:creator>aloo</dc:creator>
				<category><![CDATA[cache]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://blog.aloo.cn/2009/09/%e7%bc%93%e5%ad%98%e5%81%9a%e7%9a%84%e4%ba%8b%e6%83%85/</guid>
		<description><![CDATA[&#160; 首先从最基本的缓存机制开始,Alice第一次访问网站向Cache发送了请求，cache没有Alice要的数据.于是又向后端(Backend)发现请求，从服务器上获取了数据以后，沿着原路返回。 当网站数据较少的时候，上面的模型已经足够了。但是数据总是在膨胀的~~~ 为了加速，我们希望缓存(cache)中能存一些用户常访问的数据。如时我们开始在http请求中加入Cache-Control:max-age这个参数。当第一个用户访问这个数据后，数据就会在缓存中缓存一个设定的时间。 &#160; 当后来的用户在访问这个数据的时间，发现这个数据就在缓存中直接返回，就不在去后端服务器上取数据了。某个数据的访问量大时，它的max-age总是没有过期，于是就总在缓存中，大大提高了数据的命中率，和传输效率。 到这里，这种过期机制(Expiration) 冒似已经很理想了。 但是，在一个动态更新的网站里，这些显然还不够。 当数据，被缓存在cache里的时候Backend上这个数据的值已经发生了改变。或者说产生了新的内容，用户(Bob)怎么才能得到新的数据呢。Bob已经从cache中直接回去了. 于是我们需要验证机制(validation),在http头里面加上Last-Modified和E-tag 当Alice第一次访问这个数据的时候，http请求里面包括了这个数据最后修改的日期(Last-Modified),和有一个实体标记(Entity-Tag),这个是唯一的，随机的。 当第二个用户(Bob)来访问的时候,发出的请求If-Modified-Since和If-Node-Match两个值和刚才Alice访问时的Last-Modified,E-tag一致的时候。服务器直接给缓存返回一个304 Not Modified.这样缓存知道服务器上的数据没有改动就直接从缓存中直接读取数据返回给用户。 Expiration和validation是http缓存机制的基础，两者可以一起用。Alice第一个访问这个数据。 Bob接着访问，因为缓存还是新的，没有超期，直接从缓存返回。 &#160; Carol跟着Bob访问,这个数据已经超期过了60秒。Cache就向Backend询问有没有新数据,Backend返回304 not modified.同时更新Expiration.Cache中对这个数据进行了续期。]]></description>
			<content:encoded><![CDATA[<p>&#160;</p>
<p> 首先从最基本的缓存机制开始,Alice第一次访问网站向Cache发送了请求，cache没有Alice要的数据.于是又向后端(Backend)发现请求，从服务器上获取了数据以后，沿着原路返回。</p>
<p><a href="http://blog.aloo.cn/wp-content/uploads/2009/09/image.png"><img style="display: inline" title="image" alt="image" src="http://blog.aloo.cn/wp-content/uploads/2009/09/image_thumb.png" width="636" height="385" /></a> </p>
<p> 当网站数据较少的时候，上面的模型已经足够了。但是数据总是在膨胀的~~~</p>
<p> 为了加速，我们希望缓存(cache)中能存一些用户常访问的数据。如时我们开始在http请求中加入Cache-Control:max-age这个参数。当第一个用户访问这个数据后，数据就会在缓存中缓存一个设定的时间。</p>
<p><a href="http://blog.aloo.cn/wp-content/uploads/2009/09/image1.png"><img style="display: inline" title="image" alt="image" src="http://blog.aloo.cn/wp-content/uploads/2009/09/image_thumb1.png" width="746" height="431" /></a></p>
<p>&#160;</p>
<p> 当后来的用户在访问这个数据的时间，发现这个数据就在缓存中直接返回，就不在去后端服务器上取数据了。某个数据的访问量大时，它的max-age总是没有过期，于是就总在缓存中，大大提高了数据的命中率，和传输效率。</p>
<p><a href="http://blog.aloo.cn/wp-content/uploads/2009/09/image2.png"><img style="display: inline" title="image" alt="image" src="http://blog.aloo.cn/wp-content/uploads/2009/09/image_thumb2.png" width="558" height="355" /></a></p>
<p> 到这里，这种过期机制(Expiration) 冒似已经很理想了。   <br /> 但是，在一个动态更新的网站里，这些显然还不够。</p>
<p> 当数据，被缓存在cache里的时候Backend上这个数据的值已经发生了改变。或者说产生了新的内容，用户(Bob)怎么才能得到新的数据呢。Bob已经从cache中直接回去了.   <br /> 于是我们需要验证机制(validation),在http头里面加上Last-Modified和E-tag</p>
<p><a href="http://blog.aloo.cn/wp-content/uploads/2009/09/image3.png"><img style="display: inline" title="image" alt="image" src="http://blog.aloo.cn/wp-content/uploads/2009/09/image_thumb3.png" width="742" height="477" /></a> </p>
<p> 当Alice第一次访问这个数据的时候，http请求里面包括了这个数据最后修改的日期(Last-Modified),和有一个实体标记(Entity-Tag),这个是唯一的，随机的。</p>
<p><a href="http://blog.aloo.cn/wp-content/uploads/2009/09/image4.png"><img style="display: inline" title="image" alt="image" src="http://blog.aloo.cn/wp-content/uploads/2009/09/image_thumb4.png" width="817" height="454" /></a> </p>
<p> 当第二个用户(Bob)来访问的时候,发出的请求If-Modified-Since和If-Node-Match两个值和刚才Alice访问时的Last-Modified,E-tag一致的时候。服务器直接给缓存返回一个304 Not Modified.这样缓存知道服务器上的数据没有改动就直接从缓存中直接读取数据返回给用户。</p>
<p> Expiration和validation是http缓存机制的基础，两者可以一起用。Alice第一个访问这个数据。</p>
<p><a href="http://blog.aloo.cn/wp-content/uploads/2009/09/image5.png"><img style="display: inline" title="image" alt="image" src="http://blog.aloo.cn/wp-content/uploads/2009/09/image_thumb5.png" width="742" height="477" /></a></p>
<p>Bob接着访问，因为缓存还是新的，没有超期，直接从缓存返回。 </p>
<p><a href="http://blog.aloo.cn/wp-content/uploads/2009/09/image6.png"><img style="display: inline" title="image" alt="image" src="http://blog.aloo.cn/wp-content/uploads/2009/09/image_thumb6.png" width="562" height="378" /></a>&#160;</p>
<p>Carol跟着Bob访问,这个数据已经超期过了60秒。Cache就向Backend询问有没有新数据,Backend返回304 not modified.同时更新Expiration.Cache中对这个数据进行了续期。</p>
<p><a href="http://blog.aloo.cn/wp-content/uploads/2009/09/image7.png"><img style="display: inline" title="image" alt="image" src="http://blog.aloo.cn/wp-content/uploads/2009/09/image_thumb7.png" width="823" height="454" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aloo.cn/2009/09/%e7%bc%93%e5%ad%98%e5%81%9a%e7%9a%84%e4%ba%8b%e6%83%85/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
