2011年5月14日 星期六

[Web] Cache

* cache 有以下類型:
  • cache 在 client browse.
    • 客户端的 browser 會自動 cache 一部份的靜態文件,以增加網頁速度。
  • cache 在 proxy server.
    • ISP 為了增加用户的訪問速度,也會在中轉的 server 中提供大量的 cache 文件,user 不用到目的地取,中途就有 data。
  • web 應用也会在 server 部署 cache module,從而將不會即時更新的網頁 cache 起來。
    • 這種 cache 有些是通過編寫程序實現的,有些是使用例如 memcached 這類模組實現的。
  • 編譯器 cache
    • 比如: php 程序在 zend engine 上跑,每次跑的时候都會進行編譯,這個編譯過程是會耗費 cpu 的。因此優化工具會自動 cache 已編譯的的结果。當然,jsp 也是這樣,不然我们總可以在 tomcat 的文件夾下找到些莫名的class 文件。

* 動態文件的 cache 方式:
  • 對於小的可重用的 data,通過 cookie cache 動態结果是個不錯的選擇。
  • 通過文件做 cache
    • 尤其適合新聞網站。訪問的时候看到的後缀是 html,但是實際上該 html 文件不存在的时候,程序會重定向,從而產生 cache 文件。在 apache server 中,這種重定向工作主要是通過 mod_rewrite 來完成的。當某些缺心眼的人不给你提供這玩意的时候,也可以通過 ErrorDocument 來設置。

* Purpose:
  • 因為大多數情況下,response time 都會花在取資料上,而且從 internet 的邊緣(?) retrieve data 比從 internet 中的速度更快、省錢。因此將不常更新的 web data 靠近 end user 保存,通过减少重複查詢 DB 的次數來提高 DB 的效能,即時返回 response data,達到增加打開網頁的速度,避免重複計算,使服務提供商保留頻寬,節省費用。
  • cache 設備 (proxy server?) 工作在比 router 更高的層次上,能夠把 user 要訪問的 message 抓到 local side,在最短的時間內將 message 連續、完整且即時的傳遞給 end user,不僅縮短了 response time,也提高了 server 在高峰時所能承受的訪問量。
  • In a word, 可以:
    • 降低頻寬的使用
    • 提升 server 效能


[cache in Client]

* 一般瀏覽器在瀏覽一個網頁時會把網頁上的資料複製一份到 Temporary Internet Files,因此打開網頁時速度不快,但再次打開時就會很快。

* 一些動態網頁,若被瀏覽器 cache 起來,然後沒有關閉 browser 再開啟便不會自動更新內容,因此即使按 F5 重新整理後也會看不出其變化。

* 每次 user 請求一個頁面的時候, browser 會先到 cache 裡查找是否有符合要求且尚未過期的內容,如果有則直接讀取 cache,而能省略網路傳輸。

* 因此通常靜態比較會採用 cache 方式。


[cache in Server]

* 如果您的瀏覽器有設定Proxy Server,瀏覽器閱讀前會先到Proxy Server上索取資料,如果Proxy Server上有資料(代表曾經有人讀取過該網頁)就會從Proxy Server上索取資料。


[No cache]

* 透過 HTTP head tag 中的 “Cache-control” 來控制。

* value 有 private、no-cache、max-age、must-revalidate等,default private。

* 其作用根據不同的重新瀏覽方式分為以下幾種情况:
  • 打開新窗口,如果指定 cache-control 的值為:
    • private、 no-cache、 must-revalidate,那麼打開新窗口訪問時都會重新 request server。
    • 而如果指定了 max-age 值,那麼在此值内的時間裡就不會重新 request。
  • 在位址輸入 URL,如果值為:
    • private 或 must-revalidate,只有第一次訪問時會訪問 server,之後就不會再訪問了。
    • no-cache,那麼每次都會訪問。
    • max-age,在過期前不會再訪問。
  • 回上一頁,如果值為:
    • private、must-revalidate、max-age,不會重訪問。
    • no-cache,每次都重複訪問。
  • 刷新頁面
    • 無論何值都會重覆訪問。(【Ctrl】 + 【F5】就可強制更新?)

* 根據 http 協議,通常是通過加 meta data 來控制瀏覽器緩存的。但是需要註意的是在某個 html head 加上 meta data cache-control 其實只能控制你當前這個文件的瀏覽器緩存,而在當前文件中類似於外部鏈接 javascript 文件或者其他靜態資源是不會加上任何 meta data 的,除非你使用 mod_expires 或者 mod_header 來配置的你的 apache 服務器。

* 原來有以下幾個語法可防止被 cache ,而每次 query 就都到網站來抓該網頁。

<%
    Response.Expires=0 
    Response.CacheControl = "no-cache"     
    Response.AddHeader "Pragma","no-cache"   
%>


* Reference
- 網頁內容不要使用cache的方法
- 不要把網頁 cache 起來的語法
- ASP.NET Cache支持的三种类型
- Web服务器服务器加速技术一(2)
- 系统管理 —— 缓存更新
- 第十三章 缓存机制
- http meta data 简介
- 8-2-3 整理cache
- http瀏覽器緩存控制筆記
- Cache无处不在

沒有留言:

張貼留言