1.前言
我们回顾一下之前讲到的Redis的字典结构,示意图如下:
Redis的字典本质上来说也是数组+链表的数据结构,这与Java中HashMap的数据结构很类似啦。
由上述结构示意图也能看出,字典dict中维护了一个ht数组,而且只有两个元素,这两个元素是其扩容的关键点,这个我们后面会讲到。
Redis中的哈希对象在以下条件时,使用ziplist编码,
- 哈希对象保存的所有键值的字符串长度都小于64字节
- 哈希对象保存的键值对数量小于512个。
否则哈希对象会使用hashtable编码, 而hashtable则时使用了字典作为底层实现的。
如下redis 哈希对象编码由ziplist 变成hashtable
2.增加元素与键冲突
当不同的键值经过哈希算法与散列算法之后被分配到了同一个哈希表数组的同一个索引上,那么这之后就会有键冲突。
Redis 哈希表解决哈希冲突同样是使用了链表地址法。使用哈希节点的next指针来链接同一个哈希表数组索引上的元素。不过Redis会将新添加的哈希节点加入到链表的表头位置。
如下所示:如果程序要将键值对 (k2 ,