【问题标题】:Thread-safe collections with LRU caching in JavaJava 中具有 LRU 缓存的线程安全集合
【发布时间】:2019-02-10 07:17:46
【问题描述】:

我正在用 Java 编写一个用于处理文件的多线程 Rabbit MQ 客户端。但是,我确实需要一个快速且大型的缓存池,主要是地图的只读列表。数据将根据请求从 SQL 服务器中提取,但我还希望缓存内置 LRU 算法。

我找到了一个半功能的网站http://cacheonix.org,它似乎可以提供我想要的东西,但是下载页面无法正常工作。

你有什么提示吗?

我认为 LinkedHashMap 与 LRU 缓存机制/包装器相结合会满足我的大部分用途,但我首先要问的是。 https://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html

【问题讨论】:

标签: java caching concurrency rabbitmq


【解决方案1】:

如果您想亲自动手使用 LRU 实现缓存,LinkedHashMap 可能是一个选择。

LinkedHashMap 允许以插入顺序或访问顺序(默认为插入顺序)访问元素,由双链表维护。

对于访问顺序,在实现getting或put的访问操作时,被访问的元素会被移到双链表的尾部。

更重要的是,通过下面的受保护方法,LinkedHashMap 可以扩展它并自定义您自己的删除最老元素的策略。

protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
        return false;
}

通过访问顺序和删除最老元素的能力,你可以用LRU实现自己的缓存。

顺便说一句,LinkedHashMap 不是线程安全的,但是,您可以实现自己的线程安全 getter/setter。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2015-08-09
    • 2015-02-08
    • 1970-01-01
    • 2011-03-22
    • 2020-12-30
    相关资源
    最近更新 更多