標籤:
平時,我們將建立多個redis執行個體,以緩解單redis壓力範例。但,作為快取的數量增加。對redis對於擴充是一種非 - 不要無所謂。對redis有幾種方法用於擴張可能。讓我們添加每個redis最大記憶體執行個體。
之中的一個,並且缺乏靈活性和可擴充性。在redis官網上,提到了預分區技術。本文將對預分區技術進行解說,同一時候解說jedis對分區是怎樣支援的。
一、redis預分區技術
在單個server上搭建多個redis執行個體。當須要擴充時。能夠利用複製機制進行擴充。可參照例如以下步驟:
1)在新的server上建立空的redis執行個體。
2)配置新的redis執行個體作為源執行個體的從執行個體,將來源資料導到新執行個體上。
3)停止client(如jedis)。
4)將client配置的執行個體ip更新為新的server地址。
注意此處是替換老的ip地址,不能進行追加或調換各地址的順序。
5)在新server上發送SLAVEOF NO ONE命令。使其不再作為從執行個體。
6)用新的配置重新啟動client。
7)最後停止老server上不再使用的舊執行個體。
在這裡提出個問題,將老的ip地址替換後。之前映射到舊的redis執行個體上keyword能否映射到相應的新redis執行個體上?本文後面將會進行分析。
二、jedis對分區技術的實現
jedis支援分區技術。為涉及到的幾個主要類。主要分成兩部分:
1)記錄各個redis執行個體的地址資訊。從類圖中能夠看出,ShardInfo和JedisShardInfo實現了此功能;
2)使用一致性hash演算法。對keyword及redis執行個體進行映射。從類圖能夠看出Sharded提供了此功能的一個基類,BinaryShardedJedis和ShardedJedis各自是位元組和字串的實現。
在Sharded類建立時,會運行一個初始化方法。通過hash演算法,對每一個redis執行個體得出160個hash值,並將該值作為TreeMap的key,將Redis執行個體的ShardInfo資訊作為value。注意:在計算hash值時。並非使用的ip地址,而是用的一個別名。
該別名要麼是在ShardInfo中設定,要麼就是以一定規則產生。詳細可看以下的代碼:
private void initialize(List<S> shards) {nodes = new TreeMap<Long, S>();for (int i = 0; i != shards.size(); ++i) { final S shardInfo = shards.get(i); if (shardInfo.getName() == null)for (int n = 0; n < 160 * shardInfo.getWeight(); n++) { nodes.put(this.algo.hash("SHARD-" + i + "-NODE-" + n), shardInfo);} elsefor (int n = 0; n < 160 * shardInfo.getWeight(); n++) { nodes.put( this.algo.hash(shardInfo.getName() + "*" + shardInfo.getWeight() + n), shardInfo);} resources.put(shardInfo, shardInfo.createResource());} }
不使用ip地址進行雜湊,就能夠避免在ip地址變更時,緩衝裡的資料無法訪問。
這裡回答了之前提出的問題。
實際上。這裡就是一致性雜湊演算法的實現。memcached使用的也是此演算法。160個雜湊值。實際上是單個執行個體在雜湊環上的虛擬節點。假設不建立虛擬節點,在增肌或刪除節點時,會對某個節點造成壓力,假設建立虛擬節點,能夠將壓力分解到各個redis執行個體上。
著作權聲明:本文博主原創文章。部落格,未經同意不得轉載。
redis預切片技術,實現