redis数据分片算法

1.hash取余算法

设有N个分⽚,使⽤0,N-1这样序号进⾏编号.

针对某个给定的key,先计算hash值,再把得到的结果%N,得到的结果即为分⽚编号.

举例:N为3.给定key为hello,对hello计算hash值(⽐如使⽤md5算法),得到的结果为bc4b2a76b9719d91 ,再把这个结果%3,结果为0,那么就把hello这个key放到0号分⽚上.

优点: 简单高效,数据分配均匀

缺点: 扩容后需要大量的数据迁移

2.一致性hash算法

一致性Hash算法也是使用取模的方法,只是1.hash取余算法是对服务器的数量进行取模,而一致性Hash算法是对2^ 32-1取模,简单来说,一致性Hash算法将整个Hash值控件组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1取模(即哈希值是一个32位无符号整型)

整个空间按顺时针方向组织,圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6......直到2^ 32-1,也就是说0点左侧的第一个点代表2^ 32-1, 0和2^ 32-1在零点中方向重合,我们把这个由2^32个点组成的圆环称为Hash环。

下一步将各个服务器使用Hash进行一个哈希,具体可以选择服务器的主机名(考虑到ip变动,不要使用ip)作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置,这里假设将上文中三个master节点的IP地址哈希后在环空间的位置如下:

优点: ⼤⼤降低了扩容时数据搬运的规模,提⾼了扩容操作的效率.

缺点: 数据分配不均匀(有的多有的少,数据倾斜).

3.hash槽分区算法

1. 哈希槽的概念

Redis集群使用16384个哈希槽来分散键空间。这意味着集群中的每个键都通过计算其哈希值并被映射到这16384个槽中的一个。

2. 哈希槽的分配

在Redis集群中,每个节点负责一部分哈希槽。例如,一个有5个节点的集群可能会将哈希槽平均分配给这5个节点,每个节点负责3276个哈希槽(16384 / 5 = 3276)。

3. 哈希槽的计算

当Redis需要确定一个键应该被存储在哪个节点时,它会使用以下步骤:

  1. ‌计算键的哈希值 ‌:使用SHA1哈希函数计算键的哈希值。例如,如果键是"mykey",则其哈希值可以通过SHA1(mykey)计算得到。

  2. ‌取模运算‌:将得到的哈希值对16384取模(即哈希值 % 16384),以得到该键应该被映射到的哈希槽编号。

    java 复制代码
    pythonCopy Code
    hash_slot = hash_value % 16384
  3. ‌查找节点‌:根据得到的哈希槽编号,查找该槽被分配到的节点。

相关推荐
hey you~15 小时前
云呼叫中心坐席自动分配实战:ACD 策略、Redis+Lua 实现与排查清单
数据库·redis·lua·云呼叫中心·acd·坐席分配·坐席状态机
海绵宝宝转agent16 小时前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
青少儿编程课堂16 小时前
2026蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:堆排序与优先队列解析
c++·python·算法·bfs·信息学竞赛
SZYSK17 小时前
OpenHarmony 上读卡、推理和双屏刷新抢 CPU:核验机与消费机的调度差
物联网·算法·harmonyos·1024程序员节
Ivanqhz17 小时前
MoE + LLM 应用
数据库·人工智能·pytorch·python·深度学习·算法·1024程序员节
我不会起名字32217 小时前
Redis pipeline 用了反而更慢:3 类误用与正确的批量姿势
redis·pipeline·lua·rtt·批量
Tsuki_tl17 小时前
【总结】Redis五大数据类型应用场景及基本命令
数据库·redis·后端·缓存·缓存中间件·redis命令·redis 五大数据类型
lpfasd12317 小时前
推荐算法进化史
算法·机器学习·推荐算法
Pniubi17 小时前
力扣543二叉树的直径(深度优先搜索法(递归))
算法·leetcode·职场和发展
UIU1141 天前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划