理解分布式系统中的缓存架构(上)
本文主要介紹大型分布式系統(tǒng)中緩存的相關理論,常見的緩存組件以及應用場景。
1. 緩存概述
緩存概述
?
2. 緩存的分類
緩存主要分為以下四類
緩存的分類?
2.1 CDN緩存
基本介紹
CDN(Content Delivery Network 內容分發(fā)網絡)的基本原理是廣泛采用各種緩存服務器,將這些緩存服務器分布到用戶訪問相對集中的地區(qū)或網絡中,在用戶訪問網站時,利用全局負載技術將用戶的訪問指向距離最近的工作正常的緩存服務器上,由緩存服務器直接響應用戶請求
應用場景
主要緩存靜態(tài)資源,例如圖片,視頻
應用圖
未使用CDN緩存?
使用CDN緩存?
優(yōu)點
優(yōu)點?
2.2 反向代理緩存
基本介紹
反向代理位于應用服務器機房,處理所有對WEB服務器的請求。 如果用戶請求的頁面在代理服務器上有緩沖的話,代理服務器直接將緩沖內容發(fā)送給用戶。如果沒有緩沖則先向WEB服務器發(fā)出請求,取回數(shù)據(jù),本地緩存后再發(fā)送給用戶。通過降低向WEB服務器的請求數(shù),從而降低了WEB服務器的負載。
應用場景
一般只緩存體積較小靜態(tài)文件資源,如css、js、圖片
應用圖
反向代理緩存應用圖?
開源實現(xiàn)
開源實現(xiàn)?
2.3 本地應用緩存
基本介紹
指的是在應用中的緩存組件,其最大的優(yōu)點是應用和cache是在同一個進程內部,請求緩存非常快速,沒有過多的網絡開銷等,在單應用不需要集群支持或者集群情況下各節(jié)點無需互相通知的場景下使用本地緩存較合適; 同時,它的缺點也是應為緩存跟應用程序耦合,多個應用程序無法直接的共享緩存,各應用或集群的各節(jié)點都需要維護自己的單獨緩存,對內存是一種浪費。
應用場景
緩存字典等常用數(shù)據(jù)
緩存介質
緩存介質?
實現(xiàn)
編程直接實現(xiàn)
編程直接實現(xiàn)?
Ehcache
基本介紹
Ehcache是一種基于標準的開源緩存,可提高性能,卸載數(shù)據(jù)庫并簡化可伸縮性。 它是使用最廣泛的基于Java的緩存,因為它功能強大,經過驗證,功能齊全,并與其他流行的庫和框架集成。Ehcache可以從進程內緩存擴展到使用TB級緩存的混合進程內/進程外部署
應用場景
Ehcache應用場景?
Ehcache架構圖
Ehcache架構圖?
Ehcache主要特征
Ehcache主要特征?
Ehcache緩存數(shù)據(jù)過期策略
緩存數(shù)據(jù)過期策略?
Ehcache過期數(shù)據(jù)淘汰機制
懶淘汰機制:每次往緩存放入數(shù)據(jù)的時候,都會存一個時間,在讀取的時候要和設置的時間做TTL比較來判斷是否過期
?
Guava Cache
2.4 分布式緩存
基本介紹
Guava Cache是Google開源的Java重用工具集庫Guava里的一款緩存工具
特點與功能
Guava Cache特點與功能?
應用場景
Guava Cache應用場景?
數(shù)據(jù)結構圖
Guava Cache數(shù)據(jù)結構圖?
Guava Cache結構特點?
緩存更新策略
Guava Cache 緩存更新策略?
緩存回收策略
Guava Cache緩存回收策略?
2.4 分布式緩存
指的是與應用分離的緩存組件或服務,其最大的優(yōu)點是自身就是一個獨立的應用,與本地應用隔離,多個應用可直接的共享緩存。
主要應用場景
分布式緩存應用場景?
主要接入方式
分布式緩存接入方式?
?
下面介紹分布式緩存常見的2大開源實現(xiàn)Memcached和Redis
Memcached
基本介紹
Memcached是一個高性能,分布式內存對象緩存系統(tǒng),通過在內存里維護一個統(tǒng)一的巨大的hash表,它能夠用來存儲各種格式的數(shù)據(jù),包括圖像、視頻、文件以及數(shù)據(jù)庫檢索的結果等。簡單的說就是將數(shù)據(jù)調用到內存中,然后從內存中讀取,從而大大提高讀取速度。
特點
Memcached特點?
基本架構
Memcached基本架構?
緩存數(shù)據(jù)過期策略
LRU(最近最少使用)到期失效策略,在Memcached內存儲數(shù)據(jù)項時,可以指定它在緩存的失效時間,默認為永久。當Memcached服務器用完分配的內時,失效的數(shù)據(jù)被首先替換,然后也是最近未使用的數(shù)據(jù)。
數(shù)據(jù)淘汰內部實現(xiàn)
懶淘汰機制:每次往緩存放入數(shù)據(jù)的時候,都會存一個時間,在讀取 的時候要和設置的時間做TTL比較來判斷是否過期
分布式集群實現(xiàn)
服務端并沒有 “ 分布式 ” 功能。每個服務器都是完全獨立和隔離的服務。 Memcached的分布式,是由客戶端程序實現(xiàn)的
數(shù)據(jù)讀寫流程圖?
Memcached分布式集群實現(xiàn)?
Redis
基本介紹
Redis是一個遠程內存數(shù)據(jù)庫(非關系型數(shù)據(jù)庫),性能強勁,具有復制特性以及解決問題而生的獨一無二的數(shù)據(jù)模型。它可以存儲鍵值對與5種不同類型的值之間的映射,可以將存儲在內存的鍵值對數(shù)據(jù)持久化到硬盤,可以使用復制特性來擴展讀性能, Redis還可以使用客戶端分片來擴展寫性能。內置了 復制(replication),LUA腳本(Lua scripting),LRU驅動事件(LRU eviction),事務(transactions) 和不同級別的 磁盤持久化(persistence), 并通過 Redis哨兵(Sentinel)和自動分區(qū)(Cluster)提供高可用性(high availability)。
數(shù)據(jù)模型
Redis數(shù)據(jù)模型?
數(shù)據(jù)淘汰策略
Redis數(shù)據(jù)淘汰策略?
數(shù)據(jù)淘汰內部實現(xiàn)
Redis數(shù)據(jù)淘汰內部實現(xiàn)?
持久化方式
Redis持久化方式?
底層實現(xiàn)部分解析
-
啟動的部分過程圖解
啟動的部分過程?
-
server端持久化的部分操作圖解
server端持久化的部分操作?
-
底層哈希表實現(xiàn)(漸進式Rehash)
初始化字典
初始化字典?
新增字典元素圖解
新增字典元素圖解?
Rehash執(zhí)行流程
Rehash執(zhí)行流程?
緩存設計原則
Redis緩存設計原則?
Redis與Memcached比較
| 支持的數(shù)據(jù)結構 | 哈希、列表、集合、有序集合 | 純kev-value |
| 持久化支持 | 有 | 無 |
| 高可用支持 | redis天然支持集群功能,可以實現(xiàn)主動復制,讀寫分離。官方也提供了sentinel集群管理工具,能夠實現(xiàn)主從服務監(jiān)控,故障自動轉移,這一切,對于客戶端都是透明的,無需程序改動,也無需人工介入 | 需要二次開發(fā) |
| 存儲value容量 | 最大512M | 最大1M |
| 內存分配 | 臨時申請空間,可能導致碎片 | 預分配內存池的方式管理內存,能夠省去內存分配時間 |
| 虛擬內存使用 | 有自己的VM機制,理論上能夠存儲比物理內存更多的數(shù)據(jù),當數(shù)據(jù)超量時,會引發(fā)swap,把冷數(shù)據(jù)刷到磁盤上 | 所有的數(shù)據(jù)存儲在物理內存里 |
| 網絡模型 | 非阻塞IO復用模型,提供一些非KV存儲之外的排序,聚合功能,在執(zhí)行這些功能時,復雜的CPU計算,會阻塞整個IO調度 | 非阻塞IO復用模型 |
| 水平擴展的支持 | 暫無 | 暫無 |
| 多線程 | Redis支持單線程 | Memcached支持多線程,CPU利用方面Memcache優(yōu)于Redis |
| 過期策略 | 有專門線程,清除緩存數(shù)據(jù) | 懶淘汰機制:每次往緩存放入數(shù)據(jù)的時候,都會存一個時間,在讀取的時候要和設置的時間做TTL比較來判斷是否過期 |
| 單機QPS | 約10W | 約60W |
| 源代碼可讀性 | 代碼清爽簡潔 | 能是考慮了太多的擴展性,多系統(tǒng)的兼容性,代碼不清爽 |
| 適用場景 | 復雜數(shù)據(jù)結構、有持久化、高可用需求、value存儲內容較大 | 純KV,數(shù)據(jù)量非常大,并發(fā)量非常大的業(yè)務 |
下一篇?《理解分布式系統(tǒng)中的緩存架構(下)》將介紹緩存架構設計常見問題以及解決方案,業(yè)界案例。
(本文同時發(fā)表于作者個人博客?www.jianshu.com/u/ced6b70c7…)
?
參考
從0開始學架構 —— Alibaba 李運華
Java核心技術36講—— Oracle 楊曉峰
分析Redis架構設計 ——上帝禁區(qū)
Memcached官方文檔
redis的持久化方式RDB和AOF的區(qū)別 —— 58沈劍
緩存,你真的用對了么? —— 58沈劍
選redis還是memcached,源碼怎么說? —— 58沈劍
緩存那些事 —— 美團技術團隊
Redis 緩存設計原則—— 雪飛鴻
Redis的緩存策略和主鍵失效機制 ——邴越
總結
以上是生活随笔為你收集整理的理解分布式系统中的缓存架构(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA拾遗--关于SPI机制
- 下一篇: 理解分布式系统中的缓存架构(下)