擁抱變化,如今也走上了.net/java通吃的時(shí)代,下面就講講如何讓.net/java都能正常訪問分片的redis吧。
有幾個(gè)關(guān)鍵點(diǎn):一致性環(huán)哈希、哈希算法、序列化、反序列化
后兩個(gè)都比較直接,只要選擇一種跨語言的序列化方式就行了,如:json, protobuf, ace等,本文全略了
本文是基于jedis的一致性環(huán)哈希來修改的,.net選的是servicestack.redis組件來修改
無奈兩個(gè)組件都有各自的一致性環(huán)哈希算法,不兼容,那就選一個(gè)作為標(biāo)準(zhǔn),修改另一個(gè)咯。本文選擇jedis的一致性環(huán)哈希作為標(biāo)準(zhǔn),進(jìn)而修改.net來適應(yīng)jedis
jedis的邏輯是給每個(gè)redis節(jié)點(diǎn)構(gòu)造160個(gè)虛擬節(jié)點(diǎn),放入一顆二叉樹中(key/value:key是一個(gè)long值,根據(jù)哈希算法算出來的一個(gè)long、value是節(jié)點(diǎn)id,是個(gè)string)。
OK,邏輯清楚了,那就簡單了,給c#端寫個(gè)一模一樣的一致性環(huán)哈希算法。
public class Sharded { private object nodes_lock = new object(); private RedBlackTreeMap<long, string> nodes = new RedBlackTreeMap<long, string>(); private IHash hashAlgo = new MD5_LongSUM_Multiply_Hash(); public void AddTarget(int index, string shard) { lock (nodes_lock) { for (int n = 0; n < 160; ++n) { &nb