目录
背景
随着业务系统越来越大,我们需要对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)中间的所有整数首尾相接连接成一个环.如下图:
然后将所有的节点映射到环上,假设我们有3