簡述快取

weixin_34320159發表於2016-08-26

在高併發情況下如何降低資料庫和伺服器的壓力保證使用者體驗,如何提高網站的效能,這些離不開快取。而快取越接近於使用者越好。

瀏覽器快取

瀏覽器快取是儲存於客戶端的快取。對於一些不經常變化的http資料請求響應我們可以快取到客戶端。比如 css、js、html、image等靜態檔案。瀏覽器下次請求資料時如果未過期就可以直接從本地讀取資料。這樣能減輕伺服器的壓力,減少對使用者和伺服器頻寬的佔用。

注意:瀏覽器的每種操作對快取的使用是不一樣的。如點選前進後退按鈕、F5重新整理頁面、開啟新頁面。下邊是我用firefox瀏覽器結合firebug檢視具體的請求(每種瀏覽器的處理方式可能不同,未實際試驗)。

Ctrl+F5:傳送所有請求,不和伺服器端快取協商,直接從伺服器獲取資料返回200。


2795495-e2fad738dd4cec76

F5:傳送所有請求,和伺服器端快取協商,沒有過期的直接讀取本地快取,響應返回304,已過期的伺服器響應200並返回資料。


2795495-fce3ff3abbe97ed2

新視窗開啟頁面、位址列回車重新整理頁面:沒有過期的直接使用本地快取,不向伺服器傳送請求。


2795495-d72a06e016c0c913

點選前進後退按鈕:不傳送任何請求,直接使用本地快取。


2795495-c609abe2a38e3223

注意:如何讓使用者獲取最新的內容,比如你修改了一個css檔案,而瀏覽器還是從本地讀取的舊資料。這裡我採用了在每個檔案後邊加一個版本號引數的方式(如下圖),你可以通過修改版本號使快取失效。


2795495-c8ecfe36646babc8

2795495-e5522fbffc0a8a0e

CDN

內容分發網路(Cloud Delivery Network,簡稱 CDN)即全網內容加速服務,利用遍佈全球的加速節點,可以使使用者訪問最近的節點,提高使用者訪問網站的響應速度與網站可用性,減少伺服器壓力與伺服器頻寬。

注意CDN的重新整理。

快取伺服器

Varnish:Varnish是一款高效能的開源HTTP加速器。記憶體快取。http://www.varnish-cache.org/
Squid:硬碟快取。
也有一些其他通過工具是通過外掛實現的,比如nginx。
這裡我推薦使用Varnish。

資料快取

我一般會把資料庫查詢結果快取起來,下次請求的時候直接讀取快取檔案,這樣可以減少資料庫查詢次數。

資料快取主要分為快取到伺服器硬碟靜態檔案上和快取到伺服器記憶體中。

  • 記憶體快取:存放區伺服器的記憶體空間中,速度快。儲存空間有限。
  • 靜態檔案快取:存放於硬碟檔案中,容量大,速度比記憶體快取慢很多。

主要的工具有:

  • Memcached:key => value 式專業高效能分散式記憶體快取伺服器。
  • Redis: 除了可以用來做快取還可以做其他用途,比如釋出訂閱 、佇列處理等。
  • 一些模板引擎和快取類大都支援檔案快取。

有些場景你使用Redis來快取可能比較方便。比如你需要統計文章頁面的訪問次數,這個時候你可以把訪問次數儲存到Redis中,每隔一段時間重新整理寫入到資料庫,減少資料庫的更新。

問題:如何設定快取?
快取的設定可以分為被動設定和主動設定。例如,當我們往資料庫插入一條資料之後可以直接把此條資料寫入快取,也可以等使用者訪問的時候寫入快取。更新資料庫資料後我們可以直接刪除此條快取也可以更新後同時更新快取。在瞬間高併發請求一個未快取過的資料的時候會出現大量的資料庫資料查詢請求。所以有些地方還是建議主動設定快取較好。

問題:如何更新資料快取?
我們一般會對快取設定有效時間,過期之後請求新的資料並更新快取。對於一些檔案快取有的網站還會在後臺管理中提供類似重新整理首頁快取的功能。

PHP Opcode快取

PHP是一種解釋型語言,每次 HTTP 請求呼叫時,PHP程式碼都會被解析和翻譯為操作碼(opcode)再執行。因此,當請求增加時,系統會因為處理這些不斷解釋和動態生成的頁面需要消耗大量的時間和系統資源。PHP快取加速器可用於快取和優化Web伺服器上的PHP程式碼,改善伺服器效能。

2795495-25ea0cea923ee9aa

常見的PHP編譯快取工具有以下幾個:

我在實際部署APC和eAccelerator出現過無法服務的現象(Xcache未實際測試過)。在實際使用的時候可以注意測試下網站是否能夠正常訪問,尤其是高併發情況下是否異常,選擇一個合適自己的使用。

推薦資料:深入理解PHP Opcode快取原理

其他

以上只是簡單敘述了一下快取,當然還有資料庫自身的查詢快取等。快取技術博大精深。

相關文章