👌什么是redis哈希槽的概念?
口语化回答
好的,面试官,redis 的哈希槽是集群模式下的一个概念,目的是为了实现数据的分布和管理,水平扩展,哈希槽总共有 16384 个,每个节点管理一部分的哈希槽,然后 key 通过取模算法后映射过来。再根据哈希槽对应的管理节点,就可以找到数据。初始的分配哈希槽可以采用手动指定的方式,也可以采用 redis 的工具的形式分配。有了哈希槽这种方式,能够将数据均匀分布到集群中的各个节点上,避免某些节点过载。同时实现负载均衡,确保每个节点的负载大致均衡。以上。
题目解析
集群模式必考题,如果简历写了 redis 的集群模式,这道题必考,大家一定注意。
面试得分点
哈希槽,取模,集群,数据分配
题目详细答案
哈希槽是Redis集群里的一个概念,主要用于实现数据的分布和管理。集群模式中数据是分布在多个节点上的,哈希槽的机制是确定每个键应该存储在哪个节点上。Redis集群中有16384个哈希槽(编号从0到16383)。每个键在存储之前都会根据其哈希值被映射到其中一个哈希槽。
哈希槽的工作原理
Redis使用CRC16算法对每个键进行哈希计算,然后对16384取模,得到一个哈希槽编号。例如,假设键为”mykey”,其哈希值计算结果为12345,那么12345 % 16384的结果就是哈希槽编号。集群中的每个节点负责管理一定范围的哈希槽。Redis可以把数据分布到多个节点上。例如,节点A可能负责哈希槽0到5000,节点B负责哈希槽5001到10000,节点C负责哈希槽10001到16383。
哈希槽的分配和迁移
初始分配: 集群启动时哈希槽会被分配到不同的节点上。可以手动指定每个节点负责的哈希槽范围,也可以使用Redis提供的工具自动分配。
数据迁移: 当集群中的节点发生变化(如新增节点或删除节点)时,Redis会重新分配哈希槽(重新分片resharding),相应的数据从一个节点迁移到另一个节点。
哈希槽的作用
数据分布: 通过哈希槽机制,Redis能够将数据均匀分布到集群中的各个节点上,避免某些节点过载。
负载均衡: 当集群扩展或缩减时,Redis可以通过重新分配哈希槽来实现负载均衡,确保每个节点的负载大致均衡。
高可用性: Redis集群中的每个节点可以有一个或多个副本(从节点),这些副本也会根据哈希槽进行数据复制,从而提高系统的高可用性和容错能力。
示例
假设我们有一个Redis集群,包含三个节点:节点A、节点B和节点C。哈希槽的分配如下:
- 节点A:负责哈希槽0到5460
- 节点B:负责哈希槽5461到10922
- 节点C:负责哈希槽10923到16383
当我们插入一个键”mykey”时,Redis会计算其哈希值,并映射到相应的哈希槽。例如:
1 | CRC16("mykey") = 12345 |
键”mykey”会被存储在负责哈希槽12345的节点C上。