擁抱變化,如今也走上了.net/java通吃的時代,下面就講講如何讓.net/java都能正常訪問分片的redis吧。
有幾個關(guān)鍵點:一致性環(huán)哈希、哈希算法、序列化、反序列化
后兩個都比較直接,只要選擇一種跨語言的序列化方式就行了,如:json, protobuf, ace等,本文全略了
本文是基于jedis的一致性環(huán)哈希來修改的,.net選的是servicestack.redis組件來修改
無奈兩個組件都有各自的一致性環(huán)哈希算法,不兼容,那就選一個作為標準,修改另一個咯。本文選擇jedis的一致性環(huán)哈希作為標準,進而修改.net來適應(yīng)jedis
jedis的邏輯是給每個redis節(jié)點構(gòu)造160個虛擬節(jié)點,放入一顆二叉樹中(key/value:key是一個long值,根據(jù)哈希算法算出來的一個long、value是節(jié)點id,是個string)。
OK,邏輯清楚了,那就簡單了,給c#端寫個一模一樣的一致性環(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