map和sync.map

146 阅读1分钟

map: 存一条数据的时候,会进行哈希计算,根据 B 来计算出key放在那个bucket中。比如B为5,则后哈希值的后面5位确定key 所处的bucket。而前8位二进制计算出key在bucket中的索引位置。 B的由来:zhuanlan.zhihu.com/p/366472077

map不会缩容,但是会扩容。因此可能会导致内存溢出。

map如何解决哈希冲突: 采用链地址法。 overflow 指针会指向的是下一个bucket,据此将所有冲突的键连接起来。

map存入key值过程:

  1. 跟据key值算出哈希值
  2. 取哈希值低位与hmap.B取模确定bucket位置
  3. 查找该key是否已经存在,如果存在则直接更新值
  4. 如果没找到将key,将key插入

sync.map:

  1. 以空间换效率,通过read和dirty两个map来提高读取效率 read: 是一个atomic.value的原子存取操作,是一个readonly。 dirty:

  2. 优先从read map中读取(无锁),否则再从dirty map中读取(加锁)

  3. 动态调整,当misses次数过多时,将dirty map提升为read map

  4. 延迟删除,删除只是为value打一个标记,在dirty map提升时才执行真正的删除