拥抱变化,如今也走上了.net/java通吃的时代,下面就讲讲如何让.net/java都能正常访问分片的redis吧。

有几个关键点:一致性环哈希、哈希算法、序列化、反序列化

后两个都比较直接,只要选择一种跨语言的序列化方式就行了,如:json, protobuf, ace等,本文全略了

 

本文是基于jedis的一致性环哈希来修改的,.net选的是servicestack.redis组件来修改

无奈两个组件都有各自的一致性环哈希算法,不兼容,那就选一个作为标准,修改另一个咯。本文选择jedis的一致性环哈希作为标准,进而修改.net来适应jedis

jedis的逻辑是给每个redis节点构造160个虚拟节点,放入一颗二叉树中(key/value:key是一个long值,根据哈希算法算出来的一个long、value是节点id,是个string)。

OK,逻辑清楚了,那就简单了,给c#端写个一模一样的一致性环哈希算法。

大学生就业培训,高中生培训,在职人员转行培训,企业团训

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