开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
前言
- hash对于我们来说太重要了,他主要是构建一个哈希映射表来做离散的,一个hash的好坏去觉得离散的是否彻底。hash结构特别适合存储数据,因为它能够快速的定位到数据。
- 而在redis中hash中存储的值只能是字符串作为传递媒介,redis的hash存储就好像是一个字典一样一一做映射。
主菜
- hash类型是redis的主要数据结构,也是我们平时主要使用的二结构。而redis底层是采用的ziplist和跳表字典等结构互相配合的,类似与Java中链表和树的转换。当无法满足一定条件的时候,hash 就会采用 dict(字典结构),该结构就是 Java 的 HashMap,两个只是语言设计上不同而已,dict是一个无序的字典,并采用了数组和链表相结合的方式存储数据。在 Redis 中,dict 底层又给予hash算法,到这里你可以乱了,就是hash结构底层用的字典结构,字典底层用的hash的思想,因此其查找性能非常高效,其时间复杂度为 O(1)。
矛盾
- 既然是hash就一定会出现hash冲突,出现冲突该怎么办呢?上面的ziplist和字典就是解决冲突的,保证我们在存储的时候不会出现过多的冲突。当我们在存储的时候会采用离散的思想hash。
- 有许多方法可以解决“哈希冲突”,我们熟知的比如开放地址法、还有链表地址法,再次散列法等,而 Redis 采用就是链表地址法。因为C操作链表的原生性,至于上面是链表地址法呢简单的理解就是我们将有冲突的数据使用链表把它们串联起来,这样即使发生了冲突,也可以将数据存储在一起,最后,通过遍历链表的方式就找到上述发生“冲突”的数据