Redis遇到Hash抵触怎样办
一、什么是 Hash 抵触
Hash 抵触,也称为 Hash 碰撞,是指不同的关键字经过 Hash 函数计算获取了相反的 Hash 地址。
Hash 抵触在 Hash 表中是无法防止的,由于 Hash 表的地址空间有限,而或许的关键字数量是有限的。
为了处置 Hash 抵触,有几种经常出现的方法:
不同的编程言语在面临这个疑问时也都采取了不同战略,例如:
小同伴们须要先相熟这些处置打算,由于 Redis 中的处置打算无外乎就是这四种打算中的某几种。
二、Redis 中的 Hash
Redis 中的 Hash 数据结构在底层经常使用了两种不同的数据结构来存储键值对:
Redis 会依据 Hash 表的大小和元素的数量智能在这两种数据结构之间启动切换,以保障性能和内存效率。这种灵活的数据结构选用机制使得 Redis 的 Hash 数据结构既灵敏又高效。
从上方的引见中小同伴们其实能看到,Redis 在处置 Hash 抵触的时刻,用到了两种不同的打算:
三、Redis 如何处置 Hash 抵触
依据前面的引见,小同伴们曾经明确了 Redis 在处置 Hash 抵触的时刻,用到了两种不同的打算:链地址法和 rehash。
第一种链地址法大家应该是比拟相熟的,咱们 Java 里边早期的 HashMap 就是这样的,详细数据结构如下图:
不过链地址法有一个弊病,就是假设出现少量的 key 抵触造成链表过长,此种状况下会造成数据的检索效率变慢,这不合乎 Redis 高性能的人设,那怎样办呢?
为了坚持高效,Redis 会对 Hash 表做 rehash 操作,也就经过参与 Hash 桶来缩小抵触。为了 rehash 更高效,Redis 还自动经常使用了两个全局 Hash 表,一个用于经常使用,称为主 Hash 表,一个用于扩容,称为备用 Hash 表。
详细来说,在 Hash 表扩容时,Redis 首先会创立一个新的 Hash 表,该 Hash 表的大小是原有 Hash 表的两倍,而后将原有 Hash 表中的键值对逐个迁徙到新的 Hash 表中。
在迁徙环节中,Redis 会为每个被迁徙的键值对计算出其在新 Hash 表中的位置,并将其拔出到相应的位置上。在迁徙成功后,Redis 会将新 Hash 表作为 Hash 表,用于存储新的键值对,同时监禁旧 Hash 表的内存。
由于迁徙环节是逐渐启动的,因此在迁徙环节中,既可以对新 Hash 表启动写入操作,也可以对旧 Hash 表启动读取操作,从而保障了 Redis 服务的反常运转。
四、小结
Redis 经过链地址法处置 Hash 抵触,并经过渐进式 rehash 坚持 Hash 表的性能。
链地址法成功便捷且在负载因子较低时性能较好,但在负载因子较高时性能会降低。渐进式 rehash 经过火批次迁徙数据,防止了 rehash 环节中的服务阻塞,从而坚持了系统的高性能和高可用性。
经过以上机制,Redis 在处置 Hash 抵触时能够有效地平衡性能和复杂度,确保在各种经常使用场景下都能提供高效的数据存储和检索服务。