哈希槽
redis集群用的是哈希槽,而不是简单哈希和一致性哈希。
一个哈希槽相当于一个redis实例里的一段可存一串key的地址段,好似是划了一个硬盘分区。他比db要小,比一个key要大。
当水平扩容或是挂掉部分实力时,伴随槽位的迁移。
槽位的转移,即为槽位ID不变,而是槽位地址变了。集群只需要记住槽位ID和槽位地址映射就可以了。crc计算一个key的结果是一个恒定的槽位ID,即使是槽位发生了迁移,集群根据槽位ID还是可以找到槽位新地址的。
PS 一个redis实例的组成
redis中默认有编号0-15总共16个db,默认使用db0,每个数据库都有属于自己的空间。
在redis集群时,不可以使用select命令选择db,因为redis集群仅支持db0。
redis一个实例能存多少个key? 官方说单例能处理key:2.5亿个。
一个key或是value大小最大是512M。
简单哈希
(摘自:https://www.jianshu.com/p/6ad87a1f070e 仅作个人备份,浏览请看原文)
假设有三台机,数据落在哪台机的算法为:
c = Hash(key) % 3
例如 key A 的哈希值为4,4 % 3 = 1,则落在第二台机。Key ABC 哈希值为11,11 % 3 = 2,则落在第三台机上。
利用这样的算法,假设现在数据量太大了,需要增加一台机器。A 原本落在第二台上,现在根据算法4 % 4 = 0,落到了第一台机器上了,但是第一台机器上根本没有 A 的值。这样的算法会导致增加机器或减少机器的时候,引起大量的缓存穿透,造成雪崩。
一致性哈希
一致性哈希算法对于容错性和扩展性有非常好的支持。但一致性哈希算法也有一个严重的问题,就是数据倾斜。
更多移步大佬的文章:https://www.jianshu.com/p/6ad87a1f070e