Redis-哈希槽

本文解析了Redis集群中哈希槽的概念及其作用,阐述了其如何通过CRC16算法和16384个槽位实现数据的均匀分布与节点的弹性伸缩,以及为何未采用一致性哈希算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis-哈希槽

Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念。

哈希槽的用途:

Redis 集群中内置了 16384 个哈希槽,集群的每个节点分管其中的一部分hash槽。
当需要在 Redis 集群中放置一个 key-value时,
redis 会先根据CRC16算法计算该key对应的值,然后用该值对 16384 取模,根据取模后的结果来决定放置哪个槽,
这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会再将哈希槽映射到不同的节点。

哈希槽带来的好处:

这种结构很容易添加或者删除节点,我们以后新增或移除节点的时候不用先停掉所有的 redis 服务,即,无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态,比如:

1)在增加的时候,之前的节点各自分出一些槽给新节点,对应的数据也一起迁出;

2)同样,当需要移除节点时,只需要把要移除的节点上的哈希槽挪到其他节点上就行了;

3)客户端可以向任何一个Redis节点发送请求,然后由节点将请求重定向到正确的节点上 。

为什么要选择的槽是16384个呢?

crc16会输出16bit的结果,可以看作是一个分布在0-216-1之间的数,redis的作者测试发现这个数对2{14}求模的会将key在0-2^{14-1}之间分布得很均匀,因此选了这个值。

为什么没有用一致性哈希算法?

用了哈希槽的概念,而没有用一致性哈希算法,不都是哈希么?这样做的原因是为什么呢?
Redis Cluster是自己做的crc16的简单hash算法,没有用一致性hash。Redis的作者认为它的crc16(key) mod 16384的效果已经不错了,虽然没有一致性hash灵活,但实现很简单,节点增删时处理起来也很方便。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值