相关疑难解决方法(0)

您将如何在Java中实现LRU缓存?

请不要说EHCache或OSCache等.为了这个问题的目的,假设我只想使用SDK(从实践中学习)来实现我自己的.鉴于缓存将在多线程环境中使用,您将使用哪些数据结构?我已经使用LinkedHashMapCollections#synchronizedMap实现了一个,但我很好奇任何新的并发集合是否会更好.

更新:当我发现这个金块时,我只是阅读Yegge的最新消息:

如果您需要持续时间访问并希望维护插入顺序,那么您不能比LinkedHashMap做得更好,这是一个真正精彩的数据结构.它可能更精彩的唯一方法是如果有并发版本.可惜.

在我使用上面提到的LinkedHashMap+ Collections#synchronizedMap实现之前,我的想法几乎完全相同.很高兴知道我不只是忽略了一些东西.

基于到目前为止的答案,对于高度并发的LRU来说,我最好的选择是使用一些相同的逻辑来扩展ConcurrentHashMapLinkedHashMap.

java caching lru data-structures

167
推荐指数
8
解决办法
12万
查看次数

轻量级Java对象缓存API

我正在寻找一个Java内存中对象缓存API.有什么建议?你过去使用过什么解决方案?

当前

现在,我只是使用地图:

Map cache = new HashMap<String, Object>();
cache.put("key", value);
Run Code Online (Sandbox Code Playgroud)

要求

我需要扩展缓存以包括以下基本功能:

  • 最大尺寸
  • 生存的时间

但是,我不需要更复杂的功能,如:

  • 从多个进程(缓存服务器)访问
  • 持久性(到磁盘)

建议

内存缓存:

  • Guava CacheBuilder - 积极开发.见这个演讲.
  • LRUMap - 通过API配置.没有TTL.不是专为缓存而构建的.
  • whirlycache - XML配置.邮件列表.上次更新2006.
  • cache4j - XML配置.俄文文件.上次更新2006.

企业缓存:

  • JCS - 属性配置.丰富的文档.
  • Ehcache - XML配置.丰富的文档.到目前为止谷歌最热门的点击率.

java caching

96
推荐指数
6
解决办法
7万
查看次数

在java中使用简单易用的LRU缓存

我知道实现起来很简单,但我想重用已经存在的东西.

我想解决的问题是我为不同的页面,角色加载配置(来自XML,所以我想缓存它们)......所以输入的组合可以增长很多(但99%不会).要处理这个1%,我希望在缓存中有一些最大数量的项目...

直到知道我在apache commons中找到了org.apache.commons.collections.map.LRUMap它看起来很好但是想要检查别的东西.有什么建议?

java caching lru

63
推荐指数
3
解决办法
6万
查看次数

LRU LinkedHashMap根据可用内存限制大小

我想创建一个LinkedHashMap,它将根据可用内存限制其大小(即,当freeMemory + (maxMemory - allocatedMemory)达到某个阈值时).这将用作缓存的一种形式,可能使用"最近最少使用"作为缓存策略.

我担心的是,allocateMemory还包括(我假设)未垃圾收集的数据,因此将高估估计已用内存的数量.我担心这可能产生的意外后果.

例如,LinkedHashMap可能会继续删除项目,因为它认为没有足够的可用内存,但可用内存不会增加,因为这些已删除的项目不会立即被垃圾回收.

有没有人有这种类型的经验?我的顾虑值得关注吗?如果是这样,有人可以建议一个好的方法吗?

我应该补充一点,我也希望能够"锁定"缓存,基本上说"好吧,从现在开始不要因为内存使用问题而删除任何东西".

java garbage-collection memory-management

5
推荐指数
1
解决办法
3299
查看次数

如何运行后台线程定期清理列表中的某些元素?

我目前正在实施缓存.我已完成基本实现,如下所示.我想要做的是运行一个线程,删除满足特定条件的条目.

class Cache {
    int timeLimit = 10; //how long each entry needs to be kept after accessed(marked)
    int maxEntries = 10; //maximum number of Entries
    HashSet<String> set = new HashSet<String>();   
    public void add(Entry t){
        ....
    }

    public Entry access(String key){
        //mark Entry that it has been used
        //Since it has been marked, background thread should remove this entry after timeLimit seconds.
        return set.get(key);
    }
    ....
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我应该如何实现后台线程,以便线程绕过集合中的条目并删除已经存在的条目marked && (last access time - now)>timeLimit

编辑

上面只是代码的简化版本,我没有写同步语句.

java

3
推荐指数
1
解决办法
1491
查看次数