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位操作系统?
Redis字典结构与rehash机制
本文介绍了Redis中字典(dict)的数据结构及其工作原理,包括dictEntry的组成、dictht的设计以及rehash机制如何确保在进行rehash的同时不影响正常的增删改查操作。此外还介绍了rehash的触发条件及容量调整策略。
3283

被折叠的 条评论
为什么被折叠?



