我需要在我的应用程序中实现一个计数器的映射(类似于Map)。然而,这个结构应该可以被多个线程访问。
看起来像ConcurrentHashMap<Key, Long>
不是一个合适的解决方案,对吗?
我考虑使用ConcurrentHashMap<Key, AtomicLong>
代替。
但是有一个问题——增量请求不会均匀分布。少数最受欢迎的键可能会有高达95%的所有增量请求到达这个数据结构。
据我所知,这将导致对单个AtomicLong
实例的并发访问,并且会产生许多锁,从而降低效率。
问题1:有没有更好的解决方案——也许是更好的数据类型,而不是AtomicLong
,它允许短期累加增量或类似这样的东西?
问题2:我想定期将结构持久化到磁盘上(也许是每分钟一次),我希望持久化它的“实际”状态(包括所有最近的更新已被解决?)-最简单的方法是什么?