Redis集群方案應該怎么做?
Redis在3.0之前,是只支持單實例模式的,雖然現在服務器的內存也可以達到幾百G的規模,但是考慮到成本問題,大多數公司都會采用集群方案,把數據分片存到多個Redis實例中。
客戶端分片這個方案比較簡單,也就是在客戶端中,通過定義好的路由規則,把不同的key存儲(路由)到不同的Redis實例中;比如hash(key)%N,根據結果把key路由到Redis1-RedisN中。
優點:不依賴第三方中間件,完全自己實現,能夠自我掌控。
缺點:增加或者減少Redis實例的時候,需要調整程序,而且在調整之后的一段時間,大部分緩存會失效(路由結果改變了);
Redis中間件客戶端把請求發送到Redis中間件,中間件根據路由規則發送請求到正確的Redis實例,然后中間件再把結果返回給客戶端。常用的幾個:
Twemproxy:由Twitter開源;客戶端可以像連接Redis實例一樣連接Twemproxy,不需要修改代碼邏輯;Twemproxy可以自動地Redis保持連接(可以看成數據庫連接池),而且可以自動刪除無效Redis實例;缺點也是有的,客戶端和Redis中增加了一層,性能方面多少會有一些損耗,更大的問題,是Twemproxy無法平滑地增加Redis實例。
Codis:豌豆莢開源;它最大的優勢在于可以平滑增加或減少Redis實例,可以透明地遷移數據。
Redis3.0集群Redis3.0集群采用無中心節點方式實現,無需proxy代理,Redis把所有的Key分成了16384個slot,每個Redis實例負責其中一部分slot;客戶端直接與redis集群的每個節點連接,根據同樣的hash算法計算出key對應的slot,然后直接在slot對應的redis上執行命令(集群中的所有信息通過節點之間定期的數據交換而更新)。
Redis客戶端在任意一個Redis實例發出請求,如果所需數據不在該實例中,通過重定向命令引導客戶端訪問所需的實例。
我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。