dictEntry由3个东西组成,分别是void *key,void*val,dictEntry *next
dictht需要一个数组,由三个东西即可:
dictEntry **
size
used
数组的元素时dictEntry指针,这样节约空间,空的时候直接NULL即可。采用chaining的方式处理冲突。
如何保证一边rehash的时候,一边可以正常做增删改查呢?因为redis是单进程,单线程,所以没有问题
dict共有2个table,可以完成rehash。cpu即使空闲,也不主动去做,而是在每次增删改查的时候顺便向前推进一步。
移动的时候,先在新表中增加,完成后再删除原表中的bucket
增加:如果正在rehash,那么增加到新表中
当size是bucket总数的5倍时,是十分危险的值,就算设置为不允许rehash,也会进行rehash
使用率小于10%时,会做resize,去掉多余空间。
used>=size且允许rehash时,做rehash。
sizeof(int) == 4 64位操作系统?