
Redis中的一致性哈希
当我们增加节点时,如下图:
key3被映射到了节点D上,而key3本来被存储到节点A上。但是其他的key都能正确的查找到它对应的存储节点,被影响的只是(C, D)这一小段的key。 而一般的hash算法所有的key都会被影响到。
当主机映射在hash环上不均匀时,有可能很多key存储到了一台主机上,而其他的主机相对少很多。
这样发就可以保证key均匀分布在各个主机节点中了。并且在增加主机节点时,被影响的只有很少的一部分key,就不会出现上面一般哈希算法中存在的问题了。
发布日期:2021-05-06 22:53:09
浏览次数:37
分类:精选文章
本文共 932 字,大约阅读时间需要 3 分钟。
Redis中的一致性哈希
Redis中的一致性哈希是怎么实现的?
一般的哈希算法
一般的哈希算法,对 key 调用hash()算法得到这个 key 对应的hashCode,再对服务器的个数取模得到一个值,这个值就是这个key应该放到的对应的主机上。
例如:有3台redis主机: 0, 1, 2. hash(key) % 3 = 0; 那么这个key就放在第 0 台主机上
但是这种一般的hash算法存在很大的问题:
当我们增加主机数量后,就会产生很大的问题。例如:
上面的key, 我们假设对key使用hash()函数得到的hashCode为6. hash(key) % 3 = 0; 这个key应该存在第0台主机上.如果在集群中增加了一台主机,那么,再去查找这个key时,
hash(key) % 4 = 2; 应该到第2台主机上去找这个key。但是这个key是存到了第0台主机上的。这种一般的哈希算法会使得大量的缓存查找不到,查找不到的话就会到数据库去查询,这样就会给DB造成很大的压力。正因为如此,一致性哈希算法就是被提出来解决这个问题的。
一致性哈希算法
一致性哈希是让在增加主机数量的情况下,绝大部分的Redis缓存查找都是有效的,只有极少部分查找会失效。


一致性哈希中海油可能存在 倾斜 的问题,如下图:

解决办法
很显然,当hash环中的主机越多,那么hash环上的key被存储得就越均匀。 可以把每一个物理主机虚拟成多个虚拟主机,多个虚拟主机映射到hash环上。这样,当key存储/查找时先找到它对应的虚拟主机,由虚拟主机再存储到物理主机上。如下图:
读写流程如下:

发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年03月22日 05时51分06秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux探测工具BCC(可观测性)
2021-05-09
Opentelemetry Metrics SDK
2021-05-09
流量控制--2.传统的流量控制元素
2021-05-09
SNMP介绍及使用,超有用,建议收藏!
2021-05-09
SDUT2161:Simple Game(NIM博弈+巴什博弈)
2021-05-09
51nod 1596 搬货物(二进制处理)
2021-05-09
来自星星的祝福(容斥+排列组合)
2021-05-09
Hmz 的女装(递推)
2021-05-09
HDU5589:Tree(莫队+01字典树)
2021-05-09
不停机替换线上代码? 你没听错,Arthas它能做到
2021-05-09
sharding-jdbc 分库分表的 4种分片策略,还蛮简单的
2021-05-09
分库分表的 9种分布式主键ID 生成方案,挺全乎的
2021-05-09
MySQL不会丢失数据的秘密,就藏在它的 7种日志里
2021-05-09
Python开发之序列化与反序列化:pickle、json模块使用详解
2021-05-09
回顾-生成 vs 判别模型-和图
2021-05-09
采坑 - 字符串的 "" 与 pd.isnull()
2021-05-09
无序列表 - 链表
2021-05-09
SQL 查询强化 - 数据准备
2021-05-09
SQL 强化练习 (四)
2021-05-09