現在,緩存系統的應用很是普遍,可以用來提升併發數、數據吞吐量,提升快速響應能力。那麼當數據量達到必定程度,單機環境可能就顯得有些力不從心了,就須要一個分佈式緩存系統。java
1.1 緩存分類node
如上圖所示,首先緩存大體能夠分爲四大類。程序員
1.2 分佈式緩存redis
本文主要探討各分佈式緩存系統,如圖 1-1 所示,列出了五種:算法
其中 EvCache 和 Aerospike 使用場景不是那麼通用和普遍。spring
除此以外,還有三種常見緩存系統。數據庫
綜上所述,在通常狀況下,考慮到適用性和穩定性,Redis 是搭建緩存系統的最優選擇。如下將基於 Redis 介紹。設計模式
如頂部圖 1-1 所示,列出了 Redis 的集羣高可用的方案,基本能夠分爲三種。緩存
2.1 主從機制服務器
常見的集羣架構,搭建簡單,主要實現讀寫分離和備份,能夠由 Master 負責讀寫,Slave 負責備份。但存在故障恢復複雜、水平拓展難、寫能力受限等問題。結構圖以下:
2.2 哨兵機制
Redis Sentinel 是社區版本推出的原生高可用解決方案。由一或多個哨兵實例監視任意個主從服務器,且在 Master 宕機時,自動將宕機服務器屬下的 Slave 服務器升級爲 主服務器,從而保證系統的可用性。較主從實現的監控、選主。但問題主要是要保證 Master 的 HA 切換。結構圖以下:
2.3 "分佈式"
到這裏以上兩種機制其實只能算做「集羣」,並不是嚴格意義上的「分佈式」。接着來看看分佈式方案。
集羣強調高可用,分佈式在集羣的基礎上又強調協做。
任何分佈式存儲系統,首先面臨的就是 sharding(分片)問題,如頂部圖 1-1 所示該問題有爲三種解決方法。
3.1 客戶端分片
顧名思義,將數據分片的路由功能交給客戶端,但這是一種靜態分片,維護性差。基本是不予考慮的。
3.2 代理分片
經過代理分發到具體的 redis 實例。有兩個經常使用解決方案。
其實,這兩種代理分片的方案,都是在 Redis 官方未推出良好的分佈式方案時的產生的,在官方更新提供更優策略後都再也不維護。
3.3 服務器端分片
這就要談到 Redis 官方方案 Redis-cluster 。
在 Redis 3.0 以前是沒有較好的分佈式方案的,這也是第三方方案出現的緣由。3.0 開始,官方推出了去中心化的分佈式方案。集羣中包含 16384 個散列槽,每一個節點負責其中一部分。
先看下拓撲圖:
每一個節點打開兩個 TCP 鏈接,一個負責給客戶端提供服務,一個負責節點間通訊。
此刻要說說 CAP 了 :Consistency(一致性)、Availability(可用性)、Partition tolerance(分區容錯性) 。對分佈式系統而言,CAP 必須犧牲一者。Redis Cluster 的設計目標主要是高性能、高可用和高擴展,只好拋棄一部分數據一致性。
以上介紹了簡單介紹了常見緩存系統,並具體列出了基於 Redis 的集羣方案。下面談一談緩存系統常見的問題。
以下圖所示,列出七個常見問題。
4.1. 緩存穿透
指訪問不存在的數據,從而繞過緩存,直接請求到了數據源,當請求過多,就會對 DB 形成壓力。
4.2. 緩存擊穿
緩存擊穿實際是緩存雪崩的一個特例。指當某些熱點 key 過時時,就會有大量的請求擊穿到 DB。
4.3. 緩存雪崩
同一時刻大量緩存失效(故障), 請求到了 DB。
4.4. 緩存更新與一致性
若是保證數據一致性。列出四種更新策略:
4.5. 熱點數據
對於熱點數據的處理方法。
4.6. 緩存預熱
指能夠將某些的緩存數據提早加載到緩存系統,提早避免在如熱點數據大量請求到庫。
4.7. 緩存降級
指當訪問量劇增、服務出現問題或非核心服務影響到核心流程的性能時,仍需保證主服務可用。可根據一些關鍵數據自動降級,也可配置開關人工降級。
對於 Redis Cluster 環境的搭建和基礎使用很是簡單。
不管基於何種方式,只要搭建好 n 臺 redis 服務並保證各服務間能夠互相通信後,任意進入一個 redis 服務鍵入:
redis-cli --cluster create IP1:port1 IP2:port2 IP3:port3 IP4:port4 IP5:port5 IP6:port6 ... --cluster-replicas 1
便可。以後可使用 cluster node 和 cluster info 命令查看集羣、節點信息。
而對於廣大 JAVA 開發,Spring Data Redis 從 1.7 起即支持 Redis Cluster,只需配置 Master 節點地址(和密碼)。
spring.redis.cluster.nodes=ip1:port1,ip2:port2,ip3:port3
加入依賴
compile("org.springframework.boot:spring-boot-starter-data-redis")
便可經過 RedisTemplate 使用。
本文從緩存系統的選擇出發,基於 Redis 介紹了幾種集羣方案並重點說明了 Redis Cluster 方案。以後列出緩存系統常見問題及常看法決方案,最後對使用作了簡單說明。
固然,如何去落地,如何解決這些問題還須要根據實際場景具體分析和處理。
推薦閱讀:
======
刷Github時發現了一本阿里大神的算法筆記!標星70.5K
爲何阿里巴巴的程序員成長速度這麼快,看完他們的內部資料我懂了
若是你以爲這篇內容對你還蠻有幫助,我想邀請你幫我三個小忙:
點贊,轉發,有大家的 『點贊和評論』,纔是我創造的動力。
關注公衆號 『 Java鬥帝 』,不按期分享原創知識。
同時能夠期待後續文章ing🚀