Web緩存機制淺析

本文是個人理解的網絡資料整合,如有錯誤,歡迎指正
緩存的概念
緩存就是用來避免頻繁的到主存儲器獲取數據而建立的一個存取更快的臨時存儲器。一般來說,緩存存儲的容量比主存儲器更小,但是存取速度非常快。(主存儲器一般來說指的是數據庫,結構化的磁盤文件,遠程網絡接口,程序接口等提供數據返回的存儲設備)
使用緩存的2個主要原因:

  • 降低延遲:緩存離客戶端更近,因此,從緩存請求內容比從源服務器所用時間更少,呈現速度更快,網站就顯得更靈敏。
  • 降低網絡負荷:緩存被重複使用,大大降低了用戶的帶寬使用,其實也是一種變相的省錢(如果流量要付費的話),同時保證了帶寬請求在一個低水平上,更容易維護了。

WEB緩存類型

  • 數據庫端緩存

這個可以用以“空間換時間”來說。比如建一個表來存儲另外一個表某個類型的數據的總條數,在每次更新數據的時候同事更新 數據表和統計條數的表。在需要獲取某個類型的數據的條數的時候,就不需要select count去查詢,直接查詢統計表就可以了,這樣可以提高查詢的速度和數據庫的性能。

  • 應用層緩存

1、緩存數據庫的查詢結果,減少數據的壓力,這個在大型網站是必須做的。
2、緩存磁盤文件的數據,比如常用的數據可以放到內存,不用每次都去讀取磁盤,特別是密集計算的程序。
3、緩存某個耗時的計算操作,比如數據統計。

應用層緩存架構:
1、嵌入式,也就是緩存和應用在同一個機器。比如單機的文件緩存, php中x-cache,apc等的基於進程的緩存,java中用hashMap來緩存數據等。這種緩存速度快,沒有網絡消耗。
2、分佈式緩存,把緩存的數據獨立到不同的機器,通過網絡來請求數據,比如常用的共享文件服務器、Memcache、MemcacheDb、Tokyo Tyrant, Java實現oscache,jcache ,ehcached等。Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。也是一個高速緩存系統,類似於memcached,但是支持更復雜的數據結構List、Set、Sorted Set,並且有持久化的功能。
分佈式緩存一般可以分爲幾種:
1、按應用切分數據到不同的緩存服務器,這是一種比較簡單和實用的方式。
2、按照某種規則(hash,路由等等)把數據存儲到不同的緩存服務器
3、代理模式,應用在獲取數據的時候都由代理透明的處理,緩存機制有代理服務器來處理

  • 前端代理緩存

大公司和ISP(Internet Server Provider)經常在他們的防火牆或者單獨的設備(也被稱爲中介intermediaries)上架設代理緩存。由於代理服務器緩存並非客戶端或者源服務器的一部分,而是處於網絡中,請求需要以某種方式路由到它們。一種方法是手動設置瀏覽器指定代理服務器,另外就是使用攔截代理(Interception proxies)把Web請求根據自己的底層網絡重定向,這一過程對客戶端來說是透明的。代理緩存屬於一種共享緩存;往往有大量的用戶使用,因此,其在降低延時和網絡流量上很有用。

網關緩存是反向代理緩存的一種,起中介作用的,可以有多種方法把請求路由到網關緩存,但通常使用某種形式的負載均衡器,使它們中的一個或多個看起來像是源服務器。CDN爲整個(或部分)網絡分配網關緩存,然後把這些緩存賣給需要的網站。Speedera和Akamai就是代表性的網絡內容發佈商。

1、負載均衡器:基於各種分配算法把網絡請求分散到一個服務器集羣中的可用服務器上去,通過管理進入的Web數據流量和增加有效的網絡帶寬,從而使網絡訪問者獲得儘可能最佳的聯網體驗的硬件設備。

2、內容分發網絡:CDN(Content delivery networks)的基本思路是將緩存服務器分佈到用戶訪問相對集中的地區,在現有的互聯網基礎之上構建一層智能虛擬網絡,利用中心平臺的負載均衡、內容分發、調度等功能模塊,實時地根據網絡流量和服務器集羣中各節點的連接負載狀況、到用戶的距離、響應時間等綜合因素,將用戶的請求指向距離用戶最近的工作正常的緩存服務器上,由緩存服務器直接響應用戶請求。從而儘可能避開互聯網上可能影響數據傳輸速度和穩定性的瓶頸和環節,實現降低網絡擁塞,更快更穩定的數據傳輸,提高用戶訪問的響應速度和命中率。

3、Speedera:是一家全球性的內容服務提供商,它與北美、歐洲以及亞太地區的1000多家大型運營商都有聯繫,併爲那些不想在自己服務器上寄存內容的公司提供軟件下載、媒體及其它服務管理等業務。05年的時候被Akamai以$130m的價格給收購了。

4、Akamai:美國Akamai是國際上最大的CDN服務商,它巨大的網絡分發能力在峯值時可達到15Tbps。Akamai公司是爲數不多的旨在消除Internet瓶頸和提高下載速度的幾家新公司之一,是一個致力於網絡交通提速的”內容發佈”公司,是波士頓高技術區最卓越的新興企業之一。Akamai公司向全球企業提供發送互聯網內容,匯流媒體和應用程序的服務。1998年,丹尼爾和麻省理工學院的一些研究人員一起創立了這家公司,他在麻省理工學院的碩士論文構成了Akamai公司最初的”自由流”(Freeflow)技術的核心。

5、前端其他常用的代理緩存服務器就是Squid,Varnish,Ncache等等。

補充知識點
PHP Opcode緩存
Opcode是一種PHP腳本編譯後的中間語言,類似於Java的ByteCode;先了解一下PHP代碼執行的過程:
Zend Engine調用詞法分析器將要執行的PHP源文件,去掉空格 ,註釋,分割成語言片段——Tokens;
Zend Engine將得到的Tokens forward給語法分析器, 將Tokens轉換成簡單而有意義的表達式;
Zend Engine調用zend_compile將表達式編譯成Opocde,Opocde保存在op_array中,它是PHP執行的中間語言。
Zend Engine調用zend_execute順次執行op array,輸出結果。

每一次請求PHP腳本都會執行一遍以上步驟,如果PHP源代碼沒有變化,那麼Opcode也不會變化,顯然沒有必要每次都重行生成Opcode,結合在Web中無所不在的緩存機制,可以把Opcode緩存下來,下次請求相同的內容,直接從已緩存的Opcode中取出執行,就不需要重複執行前面3步,從而大幅的提高PHP的執行速度。啓用Opcode緩存之後的流程圖如下所示:
這裏寫圖片描述
Opcode Cache的目地是避免重複編譯,減少CPU和內存開銷。如果動態內容的性能瓶頸不在於CPU和內存,而在於I/O操作,比如數據庫查詢帶來的磁盤I/O開銷,那麼Opcode Cache的性能提升是非常有限的。
PHP通過緩存頁面加速動態內容生成的原理
很多網站都是PHP構建的,PHP可以很方便的從文件或數據庫中讀取內容,然而響應時間長是它一個缺點,來自用戶的每一次請求都可能觸發多次對數據庫的查詢,然後PHP處理查詢結果,以某種形式呈現出來,像drupal這種龐大的CMS(Content Management System),每次打開一個頁面要調用數十個PHP文件,執行數萬行代碼,效率可想而知。

可以使用緩存來解決上面描述的問題,把PHP執行後的數據緩衝到內存中從而避免重複編譯;即在第一次請求由PHP腳本編譯執行生成頁面,返回結果給用戶的同時,將此次PHP腳本返回給瀏覽器的內容存儲一個備份。下一次,當用戶請求相同的內容,PHP腳本就會知道它已經生成了這個頁面,於是直接用緩存下來的結果響應給用戶的請求。

參考文檔
http://blog.yadgen.com/?p=891
http://www.cnblogs.com/sunli/archive/2009/11/24/1609444.html
http://www.zhangxinxu.com/wordpress/2013/05/caching-tutorial-for-web-authors-and-webmasters/
https://blog.linuxeye.com/361.html

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