作者 陳彩華
文章轉載交流請聯絡 caison@aliyun.com
複製程式碼
本文主要介紹大型分散式系統中快取的相關理論,常見的快取元件以及應用場景。
1 快取概述
2 快取的分類
快取主要分為以下四類
2.1 CDN快取
基本介紹
CDN(Content Delivery Network 內容分發網路)的基本原理是廣泛採用各種快取伺服器,將這些快取伺服器分佈到使用者訪問相對集中的地區或網路中,在使用者訪問網站時,利用全域性負載技術將使用者的訪問指向距離最近的工作正常的快取伺服器上,由快取伺服器直接響應使用者請求
應用場景
主要快取靜態資源,例如圖片,視訊
應用圖
優點
2.2 反向代理快取
基本介紹
反向代理位於應用伺服器機房,處理所有對WEB伺服器的請求。 如果使用者請求的頁面在代理伺服器上有緩衝的話,代理伺服器直接將緩衝內容傳送給使用者。如果沒有緩衝則先向WEB伺服器發出請求,取回資料,本地快取後再傳送給使用者。通過降低向WEB伺服器的請求數,從而降低了WEB伺服器的負載。
應用場景
一般只快取體積較小靜態檔案資源,如css、js、圖片
應用圖
開源實現
2.3 本地應用快取
基本介紹
指的是在應用中的快取元件,其最大的優點是應用和cache是在同一個程式內部,請求快取非常快速,沒有過多的網路開銷等,在單應用不需要叢集支援或者叢集情況下各節點無需互相通知的場景下使用本地快取較合適; 同時,它的缺點也是應為快取跟應用程式耦合,多個應用程式無法直接的共享快取,各應用或叢集的各節點都需要維護自己的單獨快取,對記憶體是一種浪費。
應用場景
快取字典等常用資料
快取介質
實現
程式設計直接實現
Ehcache
基本介紹
Ehcache是一種基於標準的開源快取,可提高效能,解除安裝資料庫並簡化可伸縮性。 它是使用最廣泛的基於Java的快取,因為它功能強大,經過驗證,功能齊全,並與其他流行的庫和框架整合。Ehcache可以從程式內快取擴充套件到使用TB級快取的混合程式內/程式外部署
應用場景
Ehcache架構圖
Ehcache主要特徵
Ehcache快取資料過期策略
Ehcache過期資料淘汰機制
懶淘汰機制:每次往快取放入資料的時候,都會存一個時間,在讀取的時候要和設定的時間做TTL比較來判斷是否過期
Guava Cache
2.4 分散式快取
基本介紹
Guava Cache是Google開源的Java重用工具集庫Guava裡的一款快取工具
特點與功能
應用場景
資料結構圖
快取更新策略
快取回收策略
2.4 分散式快取
指的是與應用分離的快取元件或服務,其最大的優點是自身就是一個獨立的應用,與本地應用隔離,多個應用可直接的共享快取。
主要應用場景
主要接入方式
下面介紹分散式快取常見的2大開源實現Memcached和Redis
Memcached
基本介紹
Memcached是一個高效能,分散式記憶體物件快取系統,通過在記憶體裡維護一個統一的巨大的hash表,它能夠用來儲存各種格式的資料,包括影象、視訊、檔案以及資料庫檢索的結果等。簡單的說就是將資料呼叫到記憶體中,然後從記憶體中讀取,從而大大提高讀取速度。
特點
基本架構
快取資料過期策略
LRU(最近最少使用)到期失效策略,在Memcached記憶體儲資料項時,可以指定它在快取的失效時間,預設為永久。當Memcached伺服器用完分配的內時,失效的資料被首先替換,然後也是最近未使用的資料。
資料淘汰內部實現
懶淘汰機制:每次往快取放入資料的時候,都會存一個時間,在讀取 的時候要和設定的時間做TTL比較來判斷是否過期
分散式叢集實現
服務端並沒有 “ 分散式 ” 功能。每個伺服器都是完全獨立和隔離的服務。 Memcached的分散式,是由客戶端程式實現的
Redis
基本介紹
Redis是一個遠端記憶體資料庫(非關係型資料庫),效能強勁,具有複製特性以及解決問題而生的獨一無二的資料模型。它可以儲存鍵值對與5種不同型別的值之間的對映,可以將儲存在記憶體的鍵值對資料持久化到硬碟,可以使用複製特性來擴充套件讀效能, Redis還可以使用客戶端分片來擴充套件寫效能。內建了 複製(replication),LUA指令碼(Lua scripting),LRU驅動事件(LRU eviction),事務(transactions) 和不同級別的 磁碟持久化(persistence), 並通過 Redis哨兵(Sentinel)和自動分割槽(Cluster)提供高可用性(high availability)。
資料模型
資料淘汰策略
資料淘汰內部實現
持久化方式
底層實現部分解析
-
啟動的部分過程圖解
-
server端持久化的部分操作圖解
-
底層雜湊表實現(漸進式Rehash)
初始化字典
新增字典元素圖解
Rehash執行流程
快取設計原則
Redis與Memcached比較
Redis | Memcached | |
---|---|---|
支援的資料結構 | 雜湊、列表、集合、有序集合 | 純kev-value |
持久化支援 | 有 | 無 |
高可用支援 | redis天然支援叢集功能,可以實現主動複製,讀寫分離。官方也提供了sentinel叢集管理工具,能夠實現主從服務監控,故障自動轉移,這一切,對於客戶端都是透明的,無需程式改動,也無需人工介入 | 需要二次開發 |
儲存value容量 | 最大512M | 最大1M |
記憶體分配 | 臨時申請空間,可能導致碎片 | 預分配記憶體池的方式管理記憶體,能夠省去記憶體分配時間 |
虛擬記憶體使用 | 有自己的VM機制,理論上能夠儲存比實體記憶體更多的資料,當資料超量時,會引發swap,把冷資料刷到磁碟上 | 所有的資料儲存在實體記憶體裡 |
網路模型 | 非阻塞IO複用模型,提供一些非KV儲存之外的排序,聚合功能,在執行這些功能時,複雜的CPU計算,會阻塞整個IO排程 | 非阻塞IO複用模型 |
水平擴充套件的支援 | 暫無 | 暫無 |
多執行緒 | Redis支援單執行緒 | Memcached支援多執行緒,CPU利用方面Memcache優於Redis |
過期策略 | 有專門執行緒,清除快取資料 | 懶淘汰機制:每次往快取放入資料的時候,都會存一個時間,在讀取的時候要和設定的時間做TTL比較來判斷是否過期 |
單機QPS | 約10W | 約60W |
原始碼可讀性 | 程式碼清爽簡潔 | 能是考慮了太多的擴充套件性,多系統的相容性,程式碼不清爽 |
適用場景 | 複雜資料結構、有持久化、高可用需求、value儲存內容較大 | 純KV,資料量非常大,併發量非常大的業務 |
下一篇 《理解分散式系統中的快取架構(下)》將介紹快取架構設計常見問題以及解決方案,業界案例。
(本文同時發表於作者個人部落格 www.jianshu.com/u/ced6b70c7…)