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

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

網(wǎng)友評論