動態內容緩存

4.1 緩存與速度

    這裏所說的動態內容緩存是自行實現的緩存機制,包括整頁緩存、局部緩存、數據緩存等。

    緩存的目的是把花費昂貴開銷的計算結果保存起來,以後需要的時候直接取出,避免重複的計算,一切緩存的本質都是如此。

    CPU緩存是位於CPU和內存之間的臨時寄存器,它的容量不大,但交換速度高於內存,CPU把頻繁交換的數據放在緩存中,以後需要的時候直接從緩存中讀出,從而避免訪問速度較慢的內存。

    緩衝(Buffer)的目的在於改善各部件速度不匹配的問題。例如:用戶態空間的數據寫入磁盤時,顯然內存的速度要快於磁盤的速度,這時加入磁盤緩衝區,讓數據源源不斷地寫入磁盤緩衝區,再由磁盤緩衝區再寫入磁盤,這樣內存就不用等磁盤而慢下來。視頻緩衝就是這種類型。

    緩衝和緩存都需要一塊存儲區,本質都是與速度不一致有關,但緩存更注重的是策略,也就是說緩存命中率,凡是使用緩存都需要注意命中率問題。

4.2 頁面緩存

    對動態網頁來說,緩存的內容實際是動態網頁輸出的HTML,稱爲頁面緩存。

    對於其它動態內容比如動態圖片或動態XML數據,也是將它們的輸出結果整體進行緩存,實現機制跟動態內容一樣。

    可以將動態內容緩存存儲在磁盤上,磁盤空間大、廉價,可以存儲大量的緩存文件,這是種比較容易部署的方法。

    一個動態網頁根據URL參數不同,會產生多種不同的結果,而每種結果都必須生成對應的緩存文件。如果緩存文件多的話,那麼Cache目錄下會擁擠大量的文件,這樣CPU花費在遍歷目錄的時間就非同異常,如果寫緩存比較頻繁,那麼CPU很容易100%,這時可以採用緩存目錄分級來解決這個問題。可以將每個目錄下的子目錄或文件數量控制在有限的範圍內,但同時會增加點目錄切換的次數。

    動態內容的目的在於提供變化的內容,所以它的緩存不可以長期有效,否則就失去了動態內容的意義。所以動態內容的緩存機制必須能夠判斷緩存何時失效,何時重新生成新的緩存。

    爲每個緩存標記一個過期時間,動態內容每次對緩存進行過期檢查,這是種常見的緩存過期檢查策略,當然方法有很多。

    動態內容在創建緩存文件時會留下兩個時間標記,一個是緩存文件的創建時間,一個是緩存失效時間,它有兩種過期檢查方法:

    每次檢查時,根據緩存創建的時間、緩存有效期長度及當前時間來判斷是否過期。即當前時間離緩存創建時間的長度超過了緩存有效期的時間長度則認爲它過期了,這是一種相對比較。

    每次檢查時,根據緩存失效時間和當前時間來比較來判斷是否過期,這是一種絕對比較。

    兩者的區別在:應用第2種方法時,在緩存過期前,如果修改了緩存有效期長度,是不會影響上一次緩存的過期時間。而第1種方法,修改緩存有效期長度會影響每一次的過期檢查。如果緩存有效期長度不變的話,那麼兩者是沒啥區別的。

    緩存過期檢查是存在一定開銷的。

    不只是緩存文件的加載存在磁盤IO開銷,腳本文件和頁面模板也一樣,不過有腳本加速器可以對腳本文件進行緩存和優化。

    在輸出緩存之前,不要加載不必要的東西。

    爲避免加載緩存文件時的磁盤IO和磁盤本身的負載,可以將緩存內容存放在本機內存中,這樣加載緩存文件就沒有磁盤IO的開銷。

    還可以將HTML緩存存儲在單獨的緩存服務器上,利用memcached可以通過TCP將緩存存儲到其它服務器中。而memcached就是利用內存空間來保存緩存數據,減少了不必要的磁盤IO,另一方面,memcached在存儲區中維護着對每個key的過期檢查,一旦過期,memcached將自動刪除過期的key,這種過期檢查很方便。不過放在緩存服務器上還是存在TCP Socket開銷。

    將緩存保存在內存中雖然可以減少磁盤IO開銷,但內存空間畢竟有限,這樣會導致空間不夠用時,使得緩存命中率降低,吞吐率也會相應地降低。這時就要想到如何擴展緩存空間,顯然,利用memcached來實現分佈式緩存擴展成爲可能。

    緩存有效期的取值不能太長,雖然這樣緩存命中率高了,但動態內容的更新卻不能及時實現 。如果緩存有效期的取值太短,雖然動態內容的更新內容可以及時實現,但這樣頻繁創建緩存不如不使用緩存。

    緩存機制提供了一個有效的緩存控制途徑,那就是可以在任何時候強制清除緩存,這在動態內容更新頻率較低的時候適合使用。

4.3 局部無緩存

    在流行的模板框架中,在整頁緩存的基礎上,都提供了局部無緩存的支持,它允許在頁面中指定一塊包含動態數據的HTML代碼段,每次這些動態數據進行實時計算,然後和其餘的緩存合成最終網頁。

    要注意的是要評估局部動態數據的影響力,如果一個動態網頁中佔主要開銷的數據計算置於無緩存狀態,那麼這時緩存就失去了意義,這時可以考慮使用其它的緩存方式或頁面組織結構,比如用數據層緩存。

4.4 靜態化內容

    實際情況中,吞吐率往往受限於Web服務器的出口帶寬。

    靜態化網頁的性能要大大高於動態緩存的性能,靜態網頁在請求的時候不涉及內容計算,但不代表它不需要計算,它需要動態程序來創建和更新。

    一般使用CMS來管理靜態內容,同時CMS可以在必要的時候更新靜態化內容。

    靜態內容更新策略有2種,一是在需要更新的時候重新生成靜態內容,二是定時重新生成靜態化內容。

    靜態網頁可以不必整頁更新,可以使用SSI(服務器端包含)技術實現各個局部頁面的獨立更新,這節省了整頁的計算開銷和磁盤IO開銷,甚至網絡IO,但任何節省都存在一定的開銷 。SSI技術可以在任何一款主流的Web服務器中找到相應的模塊。一旦網頁支持SSI,那麼每次請求的時候服務器必須通讀網頁內容,查找include標籤,這需要大量的CPU開銷。

    請求的文件越大,花在傳輸上的時間就越多,單位時間的數據傳輸量也越大,同時花在處理Socket和打開文件等時間比例就越小。

    使用SSI在管理靜態內容時可以重用頁面,可提高可維護性。在站點負載不大或帶寬有限制的情況下,完全可以使用必要的include來管理靜態化內容。

發佈了29 篇原創文章 · 獲贊 3 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章