簡述快取
在高併發情況下如何降低資料庫和伺服器的壓力保證使用者體驗,如何提高網站的效能,這些離不開快取。而快取越接近於使用者越好。
瀏覽器快取
瀏覽器快取是儲存於客戶端的快取。對於一些不經常變化的http資料請求響應我們可以快取到客戶端。比如 css、js、html、image等靜態檔案。瀏覽器下次請求資料時如果未過期就可以直接從本地讀取資料。這樣能減輕伺服器的壓力,減少對使用者和伺服器頻寬的佔用。
注意:瀏覽器的每種操作對快取的使用是不一樣的。如點選前進後退按鈕、F5重新整理頁面、開啟新頁面。下邊是我用firefox瀏覽器結合firebug檢視具體的請求(每種瀏覽器的處理方式可能不同,未實際試驗)。
Ctrl+F5:傳送所有請求,不和伺服器端快取協商,直接從伺服器獲取資料返回200。
F5:傳送所有請求,和伺服器端快取協商,沒有過期的直接讀取本地快取,響應返回304,已過期的伺服器響應200並返回資料。
新視窗開啟頁面、位址列回車重新整理頁面:沒有過期的直接使用本地快取,不向伺服器傳送請求。
點選前進後退按鈕:不傳送任何請求,直接使用本地快取。
注意:如何讓使用者獲取最新的內容,比如你修改了一個css檔案,而瀏覽器還是從本地讀取的舊資料。這裡我採用了在每個檔案後邊加一個版本號引數的方式(如下圖),你可以通過修改版本號使快取失效。
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程式碼,改善伺服器效能。
常見的PHP編譯快取工具有以下幾個:
- Apc:https://pecl.php.net/package/APC
- Xcache:
- eAccelerator:
https://sourceforge.net/projects/eaccelerator/
我在實際部署APC和eAccelerator出現過無法服務的現象(Xcache未實際測試過)。在實際使用的時候可以注意測試下網站是否能夠正常訪問,尤其是高併發情況下是否異常,選擇一個合適自己的使用。
推薦資料:深入理解PHP Opcode快取原理
其他
以上只是簡單敘述了一下快取,當然還有資料庫自身的查詢快取等。快取技術博大精深。
相關文章
- 簡述 HTTP 快取首部及其行為HTTP快取
- 簡述偽共享和快取一致性MESI快取
- 分散式快取架構綜述分散式快取架構
- 快取、快取演算法和快取框架簡介快取演算法框架
- 分散式快取 - 快取簡介,常用快取演算法分散式快取演算法
- Java記憶體快取-通過Map定製簡單快取Java記憶體快取
- LRU cache快取簡單實現快取
- Caffeine快取的簡單介紹快取
- 快取函式的簡單使用快取函式
- mysql查詢快取簡單使用MySql快取
- Nginx 快取使用指南-簡單Nginx快取
- memcached快取知識簡單梳理快取
- Hazelcast簡單的分散式快取AST分散式快取
- 深入理解Android中的快取機制(一)快取簡介Android快取
- 快取穿透、快取擊穿、快取雪崩、快取預熱快取穿透
- 快取穿透、快取擊穿、快取雪崩快取穿透
- 快取穿透、快取雪崩、快取擊穿快取穿透
- CNN 簡述CNN
- 簡述HTTPHTTP
- Redis快取擊穿、快取穿透、快取雪崩Redis快取穿透
- HTTP快取——協商快取(快取驗證)HTTP快取
- [Redis]快取穿透/快取擊穿/快取雪崩Redis快取穿透
- 簡單的檔案快取函式快取函式
- 簡事二三 之 http快取機制HTTP快取
- 快取穿透 快取雪崩快取穿透
- 快取問題(一) 快取穿透、快取雪崩、快取併發 核心概念快取穿透
- 快取穿透、快取擊穿、快取雪崩區別快取穿透
- 快取問題(四) 快取穿透、快取雪崩、快取併發 解決案例快取穿透
- ServiceWorker 快取與 HTTP 快取快取HTTP
- mybatis快取-二級快取MyBatis快取
- MyBatis快取機制(一級快取,二級快取)MyBatis快取
- 快取淘汰、快取穿透、快取擊穿、快取雪崩、資料庫快取雙寫一致性快取穿透資料庫
- 簡易筆記:瀏覽器快取策略筆記瀏覽器快取
- Spring Boot:簡單使用EhCache快取框架Spring Boot快取框架
- 超簡單獲取快應用摘要值
- HTML5 應用程式快取簡介HTML快取
- Android 的二級快取如斯簡單Android快取
- hibernate一二級快取簡單介紹快取