go sync: reduce (*Map).Load penalty for Stores with new keys

kknvjkwl  于 6个月前  发布在  Go
关注(0)|答案(1)|浏览(177)

在Go 1.9版本的sync.Map实现中,将任何新键存储在Map中会导致Load所有新键调用获取互斥锁,直到发生足够多的缺失次数以再次提升读写Map。
这对于仅追加的Map(如标准库中使用的sync.Map)可能没问题,因为它在稳定状态下会消失。然而,对于缓存的使用来说,这可能是个问题,因为对于那些未命中缓存的键可能会频繁地进行LoadStore调用。
我怀疑我们可以通过使用布隆过滤器或HyperLogLog过滤器而不是简单的布尔值来存储新键的集合,从而大大减少Load的惩罚:一个在只读Map中错过的Load仍然会由于写入过滤器而产生更多的缓存未命中,但它不再阻止Store调用或与其他Load竞争。

ve7v8dk2

ve7v8dk21#

(@odeke-em 和 @RLH 都提出了类似的建议。)

相关问题