Java LRU缓存:带有时间戳的LinkedHashMap?

时间:2019-12-29 08:00:18

标签: java linkedhashmap lru

我需要用Java实现一个600s过期时间的LRU缓存。我搜索并找到了内置的LinkedHashMap类。当大小超过限制时,它可以删除最旧的元素,但没有元素的过期时间。

我能想到的是在将元素放入缓存时关联时间戳。检索元素时,请检查其时间戳;如果时间戳早于600s,则从缓存中删除该元素并返回“未找到”。

还有更好的主意吗?有内置的解决方案或最佳做法吗?我想避免重新发明轮子。

2 个答案:

答案 0 :(得分:1)

仅使用Guava cache怎么样。

它支持these的全部

  

具有任何组合的LoadingCache和Cache实例的构建器   以下功能:

     
      
  • 自动将条目加载到缓存中
  •   
  • 超过最大大小时最近使用的逐出
  •   
  • 基于时间的条目有效期,自上次访问或上次写入以来测得的值
  •   
  • 键自动包装在弱引用中
  •   
  • 自动包装在弱引用或软引用中的值
  •   
  • 逐出(或以其他方式删除)条目的通知
  •   
  • 缓存访问统计信息的累积
  •   

答案 1 :(得分:1)

我建议不要自己实现它,并查看已经可用的实现:

  1. Guava Cache是​​一个相当不错的选择(已经建议使用,所以我不会在此处添加链接)
  2. Caffeine一个非常好的缓存实现。

如果您想了解两者之间的区别,请阅读this thread in SO

我相信两者都会使您明智地使用功能。 另外,如果您使用的是Spring之类的框架,则该框架已与它们集成(较新的版本使用咖啡因,较旧的则坚持使用番石榴):

Spring Cache