做者:陳彩華css
來自:51cto技術棧(ID:blog51cto)數據庫
本文主要介紹大型分佈式系統中緩存的相關理論,常見的緩存組件以及應用場景。編程
緩存概述後端
緩存概述緩存
緩存的分類服務器
緩存主要分爲四類,以下圖:網絡
緩存的分類數據結構
CDN 緩存架構
CDN(Content Delivery Network 內容分發網絡)的基本原理是普遍採用各類緩存服務器,將這些緩存服務器分佈到用戶訪問相對集中的地區或網絡中。併發
在用戶訪問網站時,利用全局負載技術將用戶的訪問指向距離最近的工做正常的緩存服務器上,由緩存服務器直接響應用戶請求。
未使用 CDN 緩存
使用 CDN 緩存
優勢
反向代理緩存
反向代理位於應用服務器機房,處理全部對 Web 服務器的請求。
若是用戶請求的頁面在代理服務器上有緩衝的話,代理服務器直接將緩衝內容發送給用戶。
若是沒有緩衝則先向 Web 服務器發出請求,取回數據,本地緩存後再發送給用戶。經過下降向 Web 服務器的請求數,從而下降了 Web 服務器的負載。
反向代理緩存應用圖
開源實現
本地應用緩存
指的是在應用中的緩存組件,其最大的優勢是應用和 Cache 是在同一個進程內部,請求緩存很是快速,沒有過多的網絡開銷等。
在單應用不須要集羣支持或者集羣狀況下各節點無需互相通知的場景下使用本地緩存較合適。
同時,它的缺點也是應爲緩存跟應用程序耦合,多個應用程序沒法直接的共享緩存,各應用或集羣的各節點都須要維護本身的單獨緩存,對內存是一種浪費。
緩存介質
編程直接實現
它是使用最普遍的基於 Java 的緩存,由於它功能強大,通過驗證,功能齊全,並與其餘流行的庫和框架集成。
Ehcache 能夠從進程內緩存擴展到使用 TB 級緩存的混合進程內/進程外部署。
Ehcache 應用場景
Ehcache 架構圖
Ehcache 主要特徵
緩存數據過時策略
Guava Cache 特色與功能
Guava Cache 應用場景
Guava Cache 數據結構圖
Guava Cache 結構特色
Guava Cache 緩存更新策略
Guava Cache 緩存回收策略
分佈式緩存
指的是與應用分離的緩存組件或服務,其最大的優勢是自身就是一個獨立的應用,與本地應用隔離,多個應用可直接的共享緩存。
分佈式緩存的主要應用場景以下圖:
分佈式緩存應用場景
分佈式緩存的主要接入方式以下圖:
分佈式緩存接入方式
下面介紹分佈式緩存常見的 2 大開源實現 Memcached 和 Redis。
Memcached 是一個高性能,分佈式內存對象緩存系統,經過在內存裏維護一個統一的巨大的 Hash 表,它可以用來存儲各類格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。
簡單的說就是將數據調用到內存中,而後從內存中讀取,從而大大提升讀取速度。
Memcached 特色
Memcached 基本架構
當 Memcached 服務器用完分配的內存時,失效的數據被首先替換,而後是最近未使用的數據。
數據讀寫流程圖
Memcached 分佈式集羣實現
Redis 是一個遠程內存數據庫(非關係型數據庫),性能強勁,具備複製特性以及解決問題而生的獨一無二的數據模型。
它能夠存儲鍵值對與 5 種不一樣類型的值之間的映射,能夠將存儲在內存的鍵值對數據持久化到硬盤,可使用複製特性來擴展讀性能。
Redis 還可使用客戶端分片來擴展寫性能,內置了 複製(replication),LUA 腳本(Lua scripting),LRU 驅動事件(LRU eviction),事務(transactions) 和不一樣級別的磁盤持久化(persistence)。
並經過 Redis 哨兵(Sentinel)和自動分區(Cluster)提供高可用性(High Availability)。
Redis 數據模型
Redis 數據淘汰策略
Redis 數據淘汰內部實現
Redis 持久化方式
啓動的部分過程圖解
Server 端持久化的部分操做圖解
底層哈希表實現(漸進式Rehash)以下圖:
初始化字典
新增字典元素圖解
Rehash 執行流程
Redis 緩存設計原則
Redis 與 Memcached 比較
下面主要介紹緩存架構設計常見問題以及解決方案,業界案例。
分層緩存架構設計
緩存帶來的複雜度問題
常見的問題主要包括以下幾點:
數據一致性
緩存穿透
緩存雪崩
緩存高可用
緩存熱點
下面逐一介紹分析這些問題以及相應的解決方案。
數據一致性
由於緩存屬於持久化數據的一個副本,所以不可避免的會出現數據不一致問題,致使髒讀或讀不到數據的狀況。
數據不一致,通常是由於網絡不穩定或節點故障致使問題出現的常見 3 個場景以及解決方案:
緩存穿透
緩存通常是 Key-Value 方式存在,當某一個 Key 不存在時會查詢數據庫,假如這個 Key,一直不存在,則會頻繁的請求數據庫,對數據庫形成訪問壓力。
主要解決方案:
對結果爲空的數據也進行緩存,當此 Key 有數據後,清理緩存。
必定不存在的 Key,採用布隆過濾器,創建一個大的 Bitmap 中,查詢時經過該 Bitmap 過濾。
緩存雪崩
緩存高可用
緩存是否高可用,須要根據實際的場景而定,並非全部業務都要求緩存高可用,須要結合具體業務,具體狀況進行方案設計,例如臨界點是否對後端的數據庫形成影響。
主要解決方案:
分佈式:實現數據的海量緩存。
複製:實現緩存數據節點的高可用。
緩存熱點
一些特別熱點的數據,高併發訪問同一份緩存數據,致使緩存服務器壓力過大。
解決:複製多份緩存副本,把請求分散到多個緩存服務器上,減輕緩存熱點致使的單臺緩存服務器壓力
業界案例
案例主要參考新浪微博陳波的技術分享,能夠查看原文《百億級日訪問量的應用如何作緩存架構設計?》
技術挑戰
Feed 緩存架構圖
架構特色
新浪微博把 SSD 應用在分佈式緩存場景中,將傳統的 Redis/MC + MySQL 方式,擴展爲 Redis/MC + SSD Cache + MySQL 方式。
SSD Cache 做爲 L2 緩存使用,第一下降了 MC/Redis 成本太高,容量小的問題,也解決了穿透 DB 帶來的數據庫訪問壓力。
主要在數據架構、性能、儲存成本、服務化等不一樣方面進行了優化加強。
...