先看字典结构
总结:
1、字典结构和哈希表类似,哈希算法、解决hash冲突的方法都一样,区别在于一个字典有两个哈希表h[0]、h[1],一张正常使用,一张用于扩容/收缩,h[1]是h[0]的两倍
2、扩容或收缩时机,需要根据redis是否进程rdb/aof持久化进行,同时还要考虑负载因子,如果redis正在fork子进程进行数据传输,同时负载因子达到条件,那么才会进行扩容,否则扩容将会影响性能
3、渐进式的rehash,rehash不是一次性的,而是根据分治思想,每次使用h[0]表的数据时,进行同步/修改,直到某个时间点,h[0]的数据全部同步完毕到h[1],这时h[1]的指针修改为h[0],原h[0]哈希表空间释放,变成h[1]