map: 存一条数据的时候,会进行哈希计算,根据 B 来计算出key放在那个bucket中。比如B为5,则后哈希值的后面5位确定key 所处的bucket。而前8位二进制计算出key在bucket中的索引位置。 B的由来:zhuanlan.zhihu.com/p/366472077
map不会缩容,但是会扩容。因此可能会导致内存溢出。
map如何解决哈希冲突: 采用链地址法。 overflow 指针会指向的是下一个bucket,据此将所有冲突的键连接起来。
map存入key值过程:
- 跟据key值算出哈希值
- 取哈希值低位与hmap.B取模确定bucket位置
- 查找该key是否已经存在,如果存在则直接更新值
- 如果没找到将key,将key插入
sync.map:
-
以空间换效率,通过read和dirty两个map来提高读取效率 read: 是一个atomic.value的原子存取操作,是一个readonly。 dirty:
-
优先从read map中读取(无锁),否则再从dirty map中读取(加锁)
-
动态调整,当misses次数过多时,将dirty map提升为read map
-
延迟删除,删除只是为value打一个标记,在dirty map提升时才执行真正的删除