如何实现具有LinkedHashMap中类似功能的ConcurrentHashMap?

我使用true以及允许任何时候最多500个条目作为数据的LRU缓存。但是由于可扩展性问题,我想转向一些线程安全的替代方案。 在这方面似乎不错,但缺乏 的功能和在 中找到的功能。任何人都可以指出一些链接或帮助我简化实现。LinkedHashMapaccessOrderConcurrentHashMapaccessOrderremoveEldestEntry(Map.Entry e)LinkedHashMap


答案 1

我最近做了类似的事情,其中CacheEntry包装了实际项目并添加了缓存逐出统计信息:过期时间,插入时间(对于FIFO / LIFO逐出),上次使用时间(对于LRU / MRU逐出),命中数(对于LFU / MFU逐出)等。实际的逐出是同步的,并使用逐出策略的相应比较器在其上创建并执行 Collections.sort()。由于这很昂贵,因此每次逐出都会从CacheEntries的底部5%中剔除。我相信性能调优会有所帮助。ConcurrentHashMap<String,CacheEntry>ArrayList<CacheEntry>

在你的情况下,由于你正在执行FIFO,你可以保留一个单独的 ConcurrentLinkedQueue。将对象添加到 ConcurrentHashMap 时,请执行该对象的 ConcurrentLinkedQueue.add()。当您要逐出条目时,请执行 ConcurrentLinkedQueue.poll() 以删除最旧的对象,然后将其从 ConcurrentHashMap 中删除。

更新:此领域的其他可能性包括Java Collections同步包装器和Java 1.6 ConcurrentSkipListMap


答案 2

您是否尝试过使用像ehcache这样的众多缓存解决方案之一?您可以尝试将LinkedHashMap与ReadWriteLock一起使用。这将为您提供并发读取访问权限。


推荐