手记

【九月打卡】第6天 go的map的扩容机制和扩容过程

课程名称深入Go底层原理,重写Redis中间件实战


课程章节:4-6 map为什么要扩容


课程讲师Moody


课程内容

  1. map为什么要扩容

    △ 当哈希碰撞较为厉害,溢出桶过多,导致性能严重下降

    △ runtime.mapassign()方法里,通过tooManyOverflowBuckets || overLoadFactor 判断是否需要扩容

    △装载因子超过6.5 

            --------LoadFactor(负载因子)= hash表中已存储的键值对的总数量/hash桶的个数(即hmap结构中buckets数组的个数)

            --------这个数据是实际测出来的,具体参考官方文档,或者读map.go代码的注释

    △使用了太多的溢出桶

  2. 扩容过程

    growing()方法

    ①创建一个组新的桶

    ②oldbuckets指针指向旧的那一组桶的数据

    ③buckets指向新的这一组桶

    ④map标记为扩容状态


    evacuated()方法

    ⑤把旧数据驱逐到新的桶里

    △采用的是渐进式的驱逐方式,每一次操作一个旧桶的时候,就把数据驱逐到新桶里

    △读取的时候是不进行驱逐的,只判断新桶还是旧桶

    ⑥驱逐所有数据后,对oldbuckets进行回收



        注意:扩容并非是真的需要扩容,有可能是旧数据删除了很多,桶变得不平均,有的hash多,有的hash少,所以对桶进行了整理


        课程收获:学习了map的扩容机制

0人推荐
随时随地看视频
慕课网APP