sync.Map底层简记

  • sync.Map是采用两个不同的map空间换时间实现的可并发读写性能平衡map
  • syncmap提供Store()用来写入或更新,Load()读取kv,Delete()删除,Range()遍历
  • readmap可以挡读、更新、删除及小部分删后写,它的核心思想是尽可能原子操作代替加锁写dirtymap
  • syncmap结构体内read字段和dirty字段都是一个key-entry的map。但是entry也是一个指针,指向同一个value数组,所以readmap更新时dirtymap也会读到更新的值,因为它们指向同一个value数组。
  • readmap挡不住的写操作流量会打到dirtymap上,dirtymap有readmiss字段记录readmap失效次数。当readmiss达到dirtymap时,此时认为readmap不能再挡太多流量了,需要对readmap数据进行更新。更新readmap操作采用直接交换readmap和dirtymap指针(因为readmap要不断进行原子操作)并置dirtymap为空, 再写dirtymap时会触发线性遍历readmap的key -entry,把readmap的非删除key 线性copy到dirtymap(此时nil删除会变为expunged删除),所以sync.map的性能低于原生map。
  • 为了挡住少量删后写操作,删除会置entry状态并不真正删除,readmap中删除是延迟删除,dirtymap中的删除是真正删除,因为延迟删除所以readmap可以挡住一部分删后写操作,具体删除状态分为nil软删除和expunged硬删除,nil状态是逻辑删除但readmap和dirtymap都有此key-entry,expunged逻辑删除但仅readmap有此entry,若nil状态删除的key都有此key -entry可以直接在readmap中更新,但如果expunged状态仅read有删除的key,那么更新时还要加锁在dirtymap写入此key。

相关推荐

  1. Channel底层简记

    2024-02-12 07:20:02       27 阅读
  2. sync.Map底层简记

    2024-02-12 07:20:02       27 阅读
  3. redis的hash数据结构底层简记

    2024-02-12 07:20:02       32 阅读
  4. Redis 底层数据结构 - 简单动态字符串

    2024-02-12 07:20:02       34 阅读
  5. React底层原理分析(简单大白话版本)

    2024-02-12 07:20:02       33 阅读
  6. Golang教程四(协程,channel,线程安全,syncMap

    2024-02-12 07:20:02       44 阅读
  7. Vuex与Vuex-Class的底层原理简单实现

    2024-02-12 07:20:02       34 阅读

最近更新

  1. MMSegmentation笔记

    2024-02-12 07:20:02       1 阅读
  2. 网络安全筑基篇——XSS、XML、XXE

    2024-02-12 07:20:02       1 阅读
  3. 语义熵:深度学习中的信息度量新指标

    2024-02-12 07:20:02       1 阅读

热门阅读

  1. django中的缓存功能

    2024-02-12 07:20:02       34 阅读
  2. RequestAndResponse(个人简陋笔记)

    2024-02-12 07:20:02       26 阅读
  3. 神经语言程式(NLP)项目的15 个开源训练数据集

    2024-02-12 07:20:02       38 阅读
  4. 设计模式-观察者模式 Observer

    2024-02-12 07:20:02       26 阅读
  5. Python语言例题集(003)

    2024-02-12 07:20:02       31 阅读
  6. 创建一个多进程服务器和多线程服务器

    2024-02-12 07:20:02       27 阅读