Home | 簡體中文 | 繁體中文 | 雜文 | 打賞(Donations) | ITEYE 博客 | OSChina 博客 | Facebook | Linkedin | 知乎專欄 | Search | Email

3.2. 緩存技術

首先要說明,很多緩存技術依賴靜態化。下面展示了緩存可能出現的位置。

用戶user -> 瀏覽器緩存 IE/Firefox Cache -> 逆向代理緩存 Reverse proxy Cache -> WEB伺服器緩存 Apache cache -> 應用程序緩存 php cache -> 資料庫緩存 database cache

當然交換機,網絡適配器,硬碟上也有Cache 但這不是我們要討論的範圍。

緩存存儲方式主要是內存和檔案兩種,後者是存於硬碟中。

網站上使用的緩存主要包括五種:

  1. 瀏覽器 緩存

  2. 逆向代理/CDN緩存

  3. WEB伺服器緩存

  4. 應用程序緩存

  5. 資料庫緩存

將上面的緩存合理地,有選擇性的使用可大大提高網站的訪問能力。

總之,想讓你的網站更快,更多並發,答案是cache,cache 再 cache

3.2.1. 瀏覽器緩存

3.2.1.1. Expires

只要向瀏覽器輸出過期時間HTTP協議頭,不論是html還是動態腳本,都能被緩存。

HTML META

				
<meta http-equive="Expires" content=" Mon, 10 Jan 2000 00:00:00 GMT"/>
<meta http-equive="Cache-Control" content="max-age=300"/>
<meta http-equive="Cache-Control" content="no-cache"/>
				
				

動態腳本

Expires: Mon, 10 Jan 2000 00:00:00 GMT
Cache-Control: max-age=300
Cache-Control: no-cache

header("Expires: " .gmdate ("D, d M Y H:i:s", time() + 3600 * 24 * 7). " GMT");
header("Cache-Control: max-age=300");
header("Cache-Control: no-cache");
				

很多web server都提供 Expires 模組

[提示]提示

有些瀏覽器可能不支持。

3.2.1.2. If-Modified-Since / Last-Modified

If-Modified-Since 小於 Last-Modified 返回 200

neo@neo-OptiPlex-780:/tmp$ curl -I http://www.163.com/
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html; charset=GBK
Transfer-Encoding: chunked
Vary: Accept-Encoding
Expires: Mon, 16 May 2011 08:12:05 GMT
Cache-Control: max-age=80
Vary: User-Agent
Vary: Accept
Age: 38
X-Via: 1.1 ls100:8106 (Cdn Cache Server V2.0), 1.1 lydx156:8106 (Cdn Cache Server V2.0)
Connection: keep-alive
Date: Mon, 16 May 2011 08:11:23 GMT
				

If-Modified-Since 大於 Last-Modified 返回 304

neo@neo-OptiPlex-780:/tmp$ curl -H "If-Modified-Since: Fri, 12 May 2012 18:53:33 GMT"  -I http://www.163.com/
HTTP/1.0 304 Not Modified
Content-Type: text/html; charset=GBK
Cache-Control: max-age=80
Age: 41
X-Via: 1.0 ls119:80 (Cdn Cache Server V2.0), 1.0 lydx154:8106 (Cdn Cache Server V2.0)
Connection: keep-alive
Date: Mon, 16 May 2011 08:11:14 GMT
Expires: Mon, 16 May 2011 08:11:14 GMT
				

3.2.1.3. ETag / If-None-Match

neo@neo-OptiPlex-780:/tmp$ curl -I http://images.example.com/test/test.html
HTTP/1.1 200 OK
Cache-Control: s-maxage=7200, max-age=900
Expires: Mon, 16 May 2011 09:48:45 GMT
Content-Type: text/html
Accept-Ranges: bytes
ETag: "1984705864"
Last-Modified: Mon, 16 May 2011 09:01:07 GMT
Content-Length: 22
Date: Mon, 16 May 2011 09:33:45 GMT
Server: lighttpd/1.4.26
				
neo@neo-OptiPlex-780:/tmp$ curl -H 'If-None-Match: "1984705864"' -I http://images.example.com/test/test.html
HTTP/1.1 304 Not Modified
Cache-Control: s-maxage=7200, max-age=900
Expires: Mon, 16 May 2011 09:48:32 GMT
Content-Type: text/html
Accept-Ranges: bytes
ETag: "1984705864"
Last-Modified: Mon, 16 May 2011 09:01:07 GMT
Date: Mon, 16 May 2011 09:33:32 GMT
Server: lighttpd/1.4.26
				

3.2.2. CDN/逆向代理緩存

具有代表性的逆向代理伺服器:

  1. Squid

  2. Nginx

  3. Varnish

  4. Apache cache module

其它逆向代理伺服器

  1. 一些提供cache的硬件設備

  2. 最近幾年出現了的 China Cache 服務商,也稱CDN

很多CDN廠商使用Squid 二次開發做為CDN節點,通過全球負載均衡使用分發

這些CDN廠商主要做了一下二次開發

  1. logs 日誌集中

  2. 流量限制

  3. push,pull操作

  4. url 刷新

s-maxage 與 max-age用法類似,s-maxage針對代理伺服器緩存。同樣適用於CDN

s-maxage 與 max-age 組合使用可以提高CDN性能

3.2.3. 負載均衡設備

F5 Big-IP, Array 等設備都提供硬件加速,其原理與squid, apache提供的功能大同小異

其中Array 頁面壓縮採用硬件壓縮卡實現,SSL加速也採用硬件實現

3.2.4. WEB伺服器緩存

例如,通過配置apache實現自身 cache

3.2.5. 應用程序緩存

在這個領域百花齊放,相信你一定能找到適合你的。這些cache會為你提供一些api,來訪問它。

代表性的 memcached 據我所是sina廣泛使用,騰訊也曾經使用過後來開發了TC(Tencent Cache),台灣雅虎則使用APC Cache。

另外模板引擎也有自己的緩存系統

3.2.6. 資料庫緩存

資料庫本身就有這個配置選項,如果需要你仍然可以在資料庫前面加一道Cache。

例如PostgreSQL, MySQL 都提供參數可以將memcached編譯到它內部