- 客戶端緩存
- 服務端緩存
- 網絡中緩存
- 單體緩存
- 緩存集羣
- 分佈式緩存
可見,在軟件系統中緩存幾乎無處不在!nginx
一:提升用戶體驗web
二:提高系統性能(響應時間、延遲時間、吞吐量、併發用戶數和資源利用率等..)這幾個方面。算法
經過緩存機制來減小數據庫鏈接資源的競爭和對數據庫讀的壓力,那麼就能夠選擇採用靜態頁面緩存,這樣程序上能夠不作修改,就能很好的減小對web服務器的壓力以及減小對數據庫鏈接資源的競爭。sql
一:客戶端緩存:對於互聯網一般來講的是BS架構應用,能夠分爲頁面緩存和瀏覽器緩存;對於移動互聯網來講,指的是APP自身所使用的緩存。數據庫
頁面緩存、瀏覽器緩存、APP上的緩存瀏覽器
二:網絡中的緩存:位於客戶端和服務端之間,對重複的請求返回緩存中的數據資源。同時接受服務端的請求,更新緩存中的內容。緩存
web代理緩存(Squid):支持創建複雜的緩存層級結構,擁有詳細的日誌,高性能緩存,支持多種插件。tomcat
邊緣緩存(nginx):向用戶提供靜態內容。CDN服務器
三:服務端緩存:整個緩存的重頭戲網絡
數據庫緩存:Mysql使用了查詢緩衝機制,將select語句和查詢結果放在緩衝區中,之後對一樣的SQL語句,將直接從緩衝區中讀取結果,節省查詢時間,提升SQL查詢的效率。
平臺級緩存:EHCache,配置簡單,結構清晰,功能強大
應用級緩存:經過代碼實現緩存機制,Redis
- 首先用戶的請求被負載均衡服務分發到Nginx上,此處經常使用的負載均衡算法是輪詢或者一致性哈希,輪詢可使服務器的請求更加均勻,而一致性哈希能夠提高Nginx應用的緩存命中率。
- 接着,Nginx應用服務器讀取本地緩存,實現本地緩存的方式能夠是Lua腳本,若是本地緩存命中,則直接返回。Nginx本地緩存在對熱點數據的反覆讀取問題上很是有效。
- 若是Nginx本地緩存沒有命中,就會進一步讀取響應的分佈式緩存Redis,若是,命中,則返回數據,並寫回到Nginx應用服務器本地緩存中。
- 若是Redis分佈式緩存尚未命中的話,則會回溯到tomcat集羣,可使用輪詢或者一致性哈希算法,若是緩存命中則直接返回數據,並會同步寫到主Redis集羣,而後再同步到從Redis集羣。
- 當全部緩存都沒有命中,就會去查詢數據庫並返回,固然數據庫也是有緩存的。
總體來看,這是一個使用了多級緩存的系統。Nginx應用服務器的本地緩存解決了熱點數據的緩存問題。Redis分佈式緩存集羣減小了訪問回溯率,Tomcat應用集羣使用的平臺級緩存防止了緩存失效、緩存雪崩以後的衝擊,數據庫緩存提高數據庫查詢時的效率。
參考書籍:深刻分佈式緩存從原理到實戰