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