redis-原理-数据结构-字典(三)
redis字典实现
redis字典使用hash表作为底层实现,一个hash表有多个hash节点,每个hash表保存了字典的一个键值对。
结构定义
字典定义
type和privdata属性是针对不同类型的键值对为创建多态字典而产生
1.type属性指向了一个dicType结构指针,每个dictType结构保存一簇用于操作特定类型键值对函数,redis会为不同类型的字典设置不同的特定类型函数
2.privdata则保存了传给那些特定函数的可选参数
3.ht属性包含2项的数组,每个项都是一个dicthat hash表,一般情况只会使用h[0].h[1]只会在h[1]rehash的时候使用
4.trehashidx他记录了当前rehash的进度,如果没有rehash则是-1
dictType定义
hash表定义
1.table是一个hash数组,每个元素都是dicthtEntiry节点
hash表结构例子
hash表节点定义
hash表如何解决hash碰撞的
因为hash表是存储的dictEntry数组,通过hash算法算出放到具体索引下,但是同一个key可能计算出同一个hash。
当出现这种情况dictEntry 的next属性就会指向另外一个hash的地址。以此来解决hash碰撞,当出现每次hash碰撞,都会将新的hash放在头部,所以插入是0(1)
字典插入一个元素做了哪些事情
字典所使用的hash算法
字典是如何进行rehash的
为什么要rehash
普通没有进行rehash的字典结构
rehash步骤例子
渐进式rehash
当我们的hash表元素很少的时候触发rehash 瞬间就完成了。但是如果我们hash表有上亿个元素呢。如果也一次性rehash到ht[1] 大量的计算可能导致redis 在一定时间停止服务
所以为了避免rehash对服务产生影响,所以是分多次 渐进式的将ht[0] 移动到ht[1]
我的理解就是在操作字典的时候 每次移动一个元素,直到移动完
渐进式rehash过程中对hash表操作
字典rehash时机
字典API的复杂度