擁抱變化,如今也走上了.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)哈希算法。

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團訓(xù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