哈希一致性算法改进

一:目前哈希一致性

目前的哈希一致性的算法 参考文章  https://blog.csdn.net/sparkliang/article/details/5279393

 

结论就是上面的图,将所有的对象都取哈希之后映射到圆环上,同时将机器也取哈希映射到圆环上(为了解决平衡性的问题,需要采取虚拟节点),按照顺时针方向将对象映射到离这个对象最近的节点上。

当初看这个算法的时候就隐隐有一种不够精确的感觉,当然看了具体的实现,虚拟节点是按照百为单位取的,也是够拼。后来就自己思考了一下,想到了以下的方案

二:我思考的方案

 

以上就是我的方案(原谅我粗糙的画图。。。),同样是一个哈希环,间隔相等的放置足够多的结点,这些节点相当于一个一个的坑,你可以按照你期望的任何方式用你的机器填满这些坑,图示就是我按照平均分配的方式用 A、B、C三个机器填满了这些坑,换句话说所有的对象将按照平均的方式分配到三个机器上。

如果加一个机器怎么办?

你可以按照你期望的任何方式将一些坑的机器换为你期望增加的机器。比如我增加了一台机器,也同样希望对象平均分配到四个机器上,并且尽可能的让更多的需求打在原来的机器上,那么解法如下:

相当于每一个机器都拿出一小部分需求分给新的机器,新增机器之后需求分布仍然是平衡的,最重要的是打在原来的机器的那些对象仍然打在相同的机器上。

具体的实现:
显然用一个hashMap就可以了,比如创建一个容量为1000的hashMap,然后对象的哈希值直接和1000取模就可以了。之前算法的实现是用 treeMap实现的,主要是使用了 tailMap() 这个函数,明显比 hashMap 慢。

优缺点比较:

新的方案是能够在保证增减机器时缓存命中率的情况下更灵活、更完美的分配对象的分布,比如,新增一个机器,希望做一下灰度,那只要拿出其中的一个坑给这个新机器就好了,如果有一个机器很给力,那完全可以拿出一半的坑给这个机器。

新的算法使用 hashMap 实现,相较于 treeMap ,速度更快

缺点是坑的个数需要提前想好(一般是一个大一点的数就可以了),不能随便改变。另一个缺点就是增减机器的算法会更复杂(灵活性的代价)

以上是我个人的思考,有问题欢迎随时指正(忽略我的文笔吧。。。。。)

欢迎查看我的另一篇关于 数据存储结构的思考 https://blog.csdn.net/songsts/article/details/83067404

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值