继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

慕九州9237533
关注TA
已关注
手记 43
粉丝 2
获赞 4

课程名称深入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标记为扩容状态

    http://img2.sycdn.imooc.com/631e00210001435c13500797.jpg


    evacuated()方法

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

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

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

    http://img4.sycdn.imooc.com/631e022c0001182417110784.jpg

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



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


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

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP