java hash取模,一致性hash算法及其java实现

目录

背景

随着业务系统越来越大,我们需要对API的访问进行更多的缓存,使用Redis是一个很好的解决方案.

但是单台Redis性能不足够且迟早要走向集群的,那么怎么才能良好的利用Redis集群来进行缓存呢?

当一个请求到来,我们如何决定将这个请求的内容缓存在那台Redis服务器上?我们一一道来.

分配方法

随机分配

假设我们有X台服务器,当一个请求来到的时候,我们获取一个0-X的随机数,然后将内容缓存在该服务器上.

这明显是不可选的,想要查询的时候我们自己也不知道在哪,只能逐个遍历服务器,知道拿到为止.

hash取模

还有一种常见的方式就是对集群数量进行hash取模.比如我们现在有3台服务器,那么对请求的key进行hash,之后拿到的hashcode对3进行取模,得到的数字就是该key应该存储的服务器.

这样虽然解决了上面的获取问题,但是扩展性极其差,设想一下现在我们需要新添加一台机器,也就是机器数量来到了4,那么对4取模的结果和对3取模的结果基本上全部不一样,也就是说我们需要对所有的key进行一次重新的hash计算并重新存储.

一致性hash

这也是我们今天的重点,它于1997年由麻省理工学院提出.我们在下面单独讲解一下他.

一致性hash原理

其实本质上,一致性hash也是hash取模,只是是永远的对2的32次方-1取模.

一致性hash引入了一个叫做一致性hash环的概念,即将(0-2^32-1)中间的所有整数首尾相接连接成一个环.如下图:

c36fab922edab7786d4721683e666516.png

然后将所有的节点映射到环上,假设我们有3

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值