做者 陳彩華
文章轉載交流請聯繫 caison@aliyun.com
複製代碼
本文主要介紹大型分佈式系統中緩存的相關理論,常見的緩存組件以及應用場景。css
緩存主要分爲如下四類 html
CDN(Content Delivery Network 內容分發網絡)的基本原理是普遍採用各類緩存服務器,將這些緩存服務器分佈到用戶訪問相對集中的地區或網絡中,在用戶訪問網站時,利用全局負載技術將用戶的訪問指向距離最近的工做正常的緩存服務器上,由緩存服務器直接響應用戶請求git
主要緩存靜態資源,例如圖片,視頻github
反向代理位於應用服務器機房,處理全部對WEB服務器的請求。 若是用戶請求的頁面在代理服務器上有緩衝的話,代理服務器直接將緩衝內容發送給用戶。若是沒有緩衝則先向WEB服務器發出請求,取回數據,本地緩存後再發送給用戶。經過下降向WEB服務器的請求數,從而下降了WEB服務器的負載。redis
通常只緩存體積較小靜態文件資源,如css、js、圖片數據庫
指的是在應用中的緩存組件,其最大的優勢是應用和cache是在同一個進程內部,請求緩存很是快速,沒有過多的網絡開銷等,在單應用不須要集羣支持或者集羣狀況下各節點無需互相通知的場景下使用本地緩存較合適; 同時,它的缺點也是應爲緩存跟應用程序耦合,多個應用程序沒法直接的共享緩存,各應用或集羣的各節點都須要維護本身的單獨緩存,對內存是一種浪費。編程
緩存字典等經常使用數據緩存
Ehcache是一種基於標準的開源緩存,可提升性能,卸載數據庫並簡化可伸縮性。 它是使用最普遍的基於Java的緩存,由於它功能強大,通過驗證,功能齊全,並與其餘流行的庫和框架集成。Ehcache能夠從進程內緩存擴展到使用TB級緩存的混合進程內/進程外部署bash
懶淘汰機制:每次往緩存放入數據的時候,都會存一個時間,在讀取的時候要和設置的時間作TTL比較來判斷是否過時服務器
Guava Cache是Google開源的Java重用工具集庫Guava裏的一款緩存工具
指的是與應用分離的緩存組件或服務,其最大的優勢是自身就是一個獨立的應用,與本地應用隔離,多個應用可直接的共享緩存。
主要應用場景
主要接入方式
下面介紹分佈式緩存常見的2大開源實現Memcached和Redis
Memcached是一個高性能,分佈式內存對象緩存系統,經過在內存裏維護一個統一的巨大的hash表,它可以用來存儲各類格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,而後從內存中讀取,從而大大提升讀取速度。
LRU(最近最少使用)到期失效策略,在Memcached內存儲數據項時,能夠指定它在緩存的失效時間,默認爲永久。當Memcached服務器用完分配的內時,失效的數據被首先替換,而後也是最近未使用的數據。
懶淘汰機制:每次往緩存放入數據的時候,都會存一個時間,在讀取 的時候要和設置的時間作TTL比較來判斷是否過時
服務端並無 「 分佈式 」 功能。每一個服務器都是徹底獨立和隔離的服務。 Memcached的分佈式,是由客戶端程序實現的
Redis是一個遠程內存數據庫(非關係型數據庫),性能強勁,具備複製特性以及解決問題而生的獨一無二的數據模型。它能夠存儲鍵值對與5種不一樣類型的值之間的映射,能夠將存儲在內存的鍵值對數據持久化到硬盤,可使用複製特性來擴展讀性能, Redis還可使用客戶端分片來擴展寫性能。內置了 複製(replication),LUA腳本(Lua scripting),LRU驅動事件(LRU eviction),事務(transactions) 和不一樣級別的 磁盤持久化(persistence), 並經過 Redis哨兵(Sentinel)和自動分區(Cluster)提供高可用性(high availability)。
圖片來自CSDN博主——上帝禁區,若是有哪位神仙知道是用什麼畫圖軟件畫的歡迎評論,我也很想知道。
啓動的部分過程圖解
server端持久化的部分操做圖解
底層哈希表實現(漸進式Rehash)
初始化字典
新增字典元素圖解
Rehash執行流程
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,數據量很是大,併發量很是大的業務 |
下一篇 《理解分佈式系統中的緩存架構(下)》將介紹緩存架構設計常見問題以及解決方案,業界案例。