Jedis源碼解析(ShardedJedis)

1 Sharding機制

sharding機制:即通常所說的“分片”,允許數據存放在不同的物理機器上, 以適應數據量過大的場景,克服單臺機器內存或者磁盤空間的限制。Redis並不支持服務器端分片(redis3.0開始支持了),不過我們可以使用Jedis提供的API來實現客戶端的分片,通過“一致性hash”算法,使得數據離散地存放在不同的服務器上面。

2 ShardedJedis類的結構

這裏寫圖片描述

3 ShardedJedis類解析

先上代碼:
這裏寫圖片描述

(1)初始化ShardedJedis
目前在jedis 2.2.1中提供4個初始化方法,其Hashing參數可以指定hash算法,SharderJedis默認採用64位的MurmurHash算法(了炸天的算法),但是也提供了MD5算法

這裏寫圖片描述

繼續深入SharderJedis的構造方法調用了Sharded類的構造方法,在Sharded方法中:
1 定義了一個TreeMap ,TreeMap 用於存儲虛擬節點(在初始化方法中,將每臺服務器節點採用hash算法劃分爲160個(默認的,DEFAULT_WEIGHT)虛擬節點(當然也可以配置劃分權重)
2 定義一個LinkedHashMap,用於存儲每一個Redis服務器的物理連接

這裏寫圖片描述
其中shardInfo的createResource就是物理連接信息
這裏寫圖片描述

(2)使用ShardedJedis操作數據的過程
怎麼進行數據的操作呢?其一般過程就是根據key獲取key對應的Jedis信息,然後再進行數據的操作!

這裏寫圖片描述

那麼是如何根據key確定對應的Jedis信息的呢?
在上面我們知道resources(LinkedHashMap)用於存儲每一個Redis服務器的物理連接,其key爲shardedInfo對象,value爲Jedis實例,因此只需要根據shardedInfo對象就可以找到jedis實例。那麼怎麼獲取對應key的shardedInfo對象呢?

這裏寫圖片描述

做法是這樣的:
1)對於key採用與初始化時同樣的hash(MurmurHash或者MD5)算法,然後從TreeMap獲取大於等於鍵hash值得節點,取最鄰近節點;
2)當key的hash值大於虛擬節點hash值得最大值時(也就是tail爲空),取第一個虛擬節點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章