为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Go

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

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


    evacuated()方法

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

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

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

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

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



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


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

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消