深入理解分布式系统中的缓存架构(上)
轉載自? ?深入理解分布式系統中的緩存架構(上)
本文主要介紹大型分布式系統中緩存的相關理論,常見的緩存組件以及應用場景。
1 緩存概述
?
2 緩存的分類
緩存主要分為以下四類
2.1 CDN緩存
基本介紹
CDN(Content Delivery Network 內容分發網絡)的基本原理是廣泛采用各種緩存服務器,將這些緩存服務器分布到用戶訪問相對集中的地區或網絡中,在用戶訪問網站時,利用全局負載技術將用戶的訪問指向距離最近的工作正常的緩存服務器上,由緩存服務器直接響應用戶請求
應用場景
主要緩存靜態資源,例如圖片,視頻
應用圖
未使用CDN緩存
優點
2.2 反向代理緩存
基本介紹
反向代理位于應用服務器機房,處理所有對WEB服務器的請求。
如果用戶請求的頁面在代理服務器上有緩沖的話,代理服務器直接將緩沖內容發送給用戶。如果沒有緩沖則先向WEB服務器發出請求,取回數據,本地緩存后再發送給用戶。通過降低向WEB服務器的請求數,從而降低了WEB服務器的負載。
應用場景
一般只緩存體積較小靜態文件資源,如css、js、圖片
應用圖
開源實現
2.3 本地應用緩存
基本介紹
指的是在應用中的緩存組件,其最大的優點是應用和cache是在同一個進程內部,請求緩存非常快速,沒有過多的網絡開銷等,在單應用不需要集群支持或者集群情況下各節點無需互相通知的場景下使用本地緩存較合適;
同時,它的缺點也是應為緩存跟應用程序耦合,多個應用程序無法直接的共享緩存,各應用或集群的各節點都需要維護自己的單獨緩存,對內存是一種浪費。
應用場景
緩存字典等常用數據
緩存介質
實現
編程直接實現
?
Ehcache
基本介紹
Ehcache是??一種基于標準的開源緩存,可提高性能,卸載數據庫并簡化可伸縮性。
它是使用最廣泛的基于Java的緩存,因為它功能強大,經過驗證,功能齊全,并與其他流行的庫和框架集成。Ehcache可以從進程內緩存擴展到使用TB級緩存的混合進程內/進程外部署
應用場景
Ehcache應用場景
Ehcache架構圖
Ehcache架構圖
Ehcache主要特征
Ehcache主要特征
Ehcache緩存數據過期策略
Ehcache過期數據淘汰機制
懶淘汰機制:每次往緩存放入數據的時候,都會存一個時間,在讀取的時候要和設置的時間做TTL比較來判斷是否過期
?
2.4 分布式緩存
基本介紹
Guava Cache是Google開源的Java重用工具集庫Guava里的一款緩存工具
特點與功能
應用場景
數據結構圖
Guava Cache數據結構圖
緩存更新策略
緩存回收策略
2.4 分布式緩存
指的是與應用分離的緩存組件或服務,其最大的優點是自身就是一個獨立的應用,與本地應用隔離,多個應用可直接的共享緩存。
主要應用場景
主要接入方式
下面介紹分布式緩存常見的2大開源實現Memcached和Redis
?
Memcached
基本介紹
Memcached是一個高性能,分布式內存對象緩存系統,通過在內存里維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,然后從內存中讀取,從而大大提高讀取速度。
特點
基本架構
緩存數據過期策略
LRU(最近最少使用)到期失效策略,在Memcached內存儲數據項時,可以指定它在緩存的失效時間,默認為永久。當Memcached服務器用完分配的內時,失效的數據被首先替換,然后也是最近未使用的數據。
數據淘汰內部實現
懶淘汰機制:每次往緩存放入數據的時候,都會存一個時間,在讀取
的時候要和設置的時間做TTL比較來判斷是否過期
分布式集群實現
服務端并沒有 “ 分布式 ” 功能。每個服務器都是完全獨立和隔離的服務。 Memcached的分布式,是由客戶端程序實現的
數據讀寫流程圖
Memcached分布式集群實現
?
Redis
基本介紹
Redis是一個遠程內存數據庫(非關系型數據庫),性能強勁,具有復制特性以及解決問題而生的獨一無二的數據模型。它可以存儲鍵值對與5種不同類型的值之間的映射,可以將存儲在內存的鍵值對數據持久化到硬盤,可以使用復制特性來擴展讀性能,
Redis還可以使用客戶端分片來擴展寫性能。內置了 復制(replication),LUA腳本(Lua scripting),LRU驅動事件(LRU eviction),事務(transactions) 和不同級別的 磁盤持久化(persistence), 并通過 Redis哨兵(Sentinel)和自動分區(Cluster)提供高可用性(high availability)。
數據模型
數據淘汰策略
數據淘汰內部實現
持久化方式
底層實現部分解析
-
啟動的部分過程圖解
-
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,數據量非常大,并發量非常大的業務 |
?
參考
從0開始學架構 —— Alibaba 李運華
Java核心技術36講—— Oracle 楊曉峰
分析Redis架構設計 ?——上帝禁區
Memcached官方文檔
redis的持久化方式RDB和AOF的區別 —— 58沈劍
緩存,你真的用對了么? —— 58沈劍
選redis還是memcached,源碼怎么說? —— 58沈劍
緩存那些事 —— 美團技術團隊
Redis 緩存設計原則—— 雪飛鴻
Redis的緩存策略和主鍵失效機制 ?——邴越
總結
以上是生活随笔為你收集整理的深入理解分布式系统中的缓存架构(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星显示 2.18 亿美元收购美国 eM
- 下一篇: 内置冰箱衣柜,丰田威尔法 Spaciou