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。

你可能感兴趣的:(go语言面试,golang)