- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一致性哈希算法的Java实现
一致性哈希算法的 Java 实现 关于一致性哈希算法的原理,网上有很多介绍,在此只是简单介绍一下,不做详细说明。 一致性哈希算法是分布式系统中常用的算法,比如有 N 台缓存服务器,你需要将数据缓存到这N 台服务 器上。一致性哈希算法可以将数据尽可能平均的存储到 N 台缓存服务器上,提高系统的负载均衡,并且 当有缓存服务器加入或退出集群时,尽可能少的影响现有缓存服务器的命中率,减少数据对后台服务的 大量冲击。 一致性哈希算法的基本原理,把数据通过hash 函数映射到一个很大的环形空间里,如下图所示: A 、B、C、D 4 台缓存服务器通过hash 函数映射环形空间上,数据的存储时,先得到一个hash 值,对 应到这个环中的每个位置,如缓存数据:K1 对应到了图中所示的位置,然后沿顺时针找到一个机器节点 A ,将K1 存储到 A 节点上,K2 存储到 A 节点上,K3 、K4 存储到 B 节点上。 如果 B 节点宕机了,则 B 上的数据就会落到 C 节点上,如下图所示: 这样,只会影响 C 节点,对其他的节点 A ,D 的数据不会造成影响。然而,这又会造成一个“雪崩”的 情况,即 C 节点由于承担了 B 节点的数据,所以 C 节点的负载会变高,C 节点很容易也宕机,这样依次 下去,这样造成整个集群都挂了。 为此,引入了“虚拟节点”的概念:即把想象在这个环上有很多“虚拟节点”,数据的存储是沿着环的 顺时针方向找一个虚拟节点,每个虚拟节点都会关联到一个真实节点,如下图所使用: 引入“虚拟节点”后,映射关系就从 { 对象 - 节点 } 转换到了 { 对象 - 虚拟节点 } 。图中的 A1 、A2 、B1 、B2、C1、C2、D1 、D2 都是虚拟节点,机器A 负载存储A1 、A2 的数据,机器B 负载存储 B1 、B2 的数据,机器C 负载存储C1、C2 的数据。由于这些虚拟节点数量很多,均匀分布,提高了平衡 性,因此不会造成“雪崩”现象。 说完了一致性哈希算法的基本原理,下面说一下一致性哈希算法的 JAVA 实现。 首先定义一个hash 函数接口:HashFunction /** * hash 函数接口 * * @author sundoctor * */ public interface HashFunction { /** * hash 函数 * * @param key * @return */ Long hash(String key); } HashFunction 一个实现,定义 HashFunction 接口,为了方便大家根据业务需要实现自己的 hash 函数。 import java.nio.ByteBu er; import java.nio.ByteOrder; public class HashFunctionImpl implements HashFunction { /** * MurMurHash 算法,是非加密 HASH 算法,性能很高,碰撞率低 */ @Override public Long hash(String key) { ByteBu er buf = ByteBu er.wrap (key.getBytes()); int seed = 0x1234ABCD; ByteOrder byteOrder = buf.order(); buf.order(ByteOrder.LITTLE_ENDIAN); long m = 0xc6a4a7935bd1e995L; int r = 47; long h = seed ^ (buf.remaining() * m); long k; while (buf.remaining() = 8) {
有哪些信誉好的足球投注网站
文档评论(0)