redis 字典

字典类图

1、字典中保存一个函数表头列表,ht[0] 平时存储数据,ht[1]空闲,当rehash的时候ht[1]分配rehash的空间
2、type中存储字典中的各种函数
3、treashindex为-1,标示没有进行rehash,不为零标示rehash的进度
redis 字典

redis 字典结构

字典在一般情况下,只有ht[0]表有数据
字典解决hash冲突的方法时开链法
redis 字典

redis 字典rehash

rehash的时机

  • 当字典没有执行BGSAVE或者BGREWRITEAOF的时候,哈希表的负载因子大于等于1
  • 当字典执行BGSAVE或BGREWRITEAOG的时候,哈希表负载因子大于等于5

rehash的方式

  • 为ht[1]分配空间,如果是扩容新容量大小为第一个大于ht[0].used*2的2的n次幂,如果是缩容操作,新容量为第一个大于ht[0].used的2的n次幂
  • 将ht[0]上的值rehash到ht[1]上去
  • 当所有的值rehash完后,释放ht[0],将ht[1]设置为ht[0],重新分配ht[1]
  • rehash是渐进式的,每次用户增删改查时,将rehashidx上的所有值rehash到ht[1],然后rehashidx+=1;这个过程中增加的值直接增加到ht[1]上;这个过程中查询操作,可以先判断rehashidx,如果小于rehashidx则在旧表查,否则,在新表查。