轻量级 Java 对象缓存 API [已关闭]

2022-08-31 10:23:53

问题

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

当前

现在,我只是在使用地图:

Map cache = new HashMap<String, Object>();
cache.put("key", value);

要求

我需要扩展缓存以包含基本功能,例如:

  • 最大尺寸
  • 生存时间

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

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

建议

内存中缓存:

  • 番石榴CacheBuilder - 主动开发。请参阅此演示文稿
  • LRUMap - 通过 API 进行配置。没有TTL。不是专门为缓存而构建的。
  • whirlycache - XML config.邮件列表。上次更新时间:2006 年。
  • cache4j - XML config.俄文文件。上次更新时间:2006 年。

企业缓存:

  • JCS - 属性配置。广泛的文档。
  • Ehcache - XML config.广泛的文档。到目前为止,根据谷歌命中率,这是最受欢迎的。

答案 1

EHCache非常好。您可以创建内存中缓存。查看他们的代码示例,了解创建内存中缓存的示例。您可以指定最大大小和生存时间。

EHCache确实提供了一些高级功能,但如果你对使用它们不感兴趣 - 不要。但是,很高兴知道如果您的要求发生变化,它们就在那里。

下面是一个内存中的缓存。在代码中创建,没有配置文件。

CacheManager cacheManager = CacheManager.getInstance();
int oneDay = 24 * 60 * 60;
Cache memoryOnlyCache = new Cache("name", 200, false, false, oneDay, oneDay);
cacheManager.addCache(memoryOnlyCache);

创建一个缓存,该缓存将包含 200 个元素,并且 ttl 为 24 小时。


答案 2

我真的很喜欢谷歌番石榴API)附带的MapMaker。)

JavaDoc有一个非常整洁的例子,展示了它的易用性和功能:

ConcurrentMap<Key, Graph> graphs = new MapMaker()
   .concurrencyLevel(32)
   .softKeys()
   .weakValues()
   .expiration(30, TimeUnit.MINUTES)
   .makeComputingMap(
       new Function<Key, Graph>() {
         public Graph apply(Key key) {
           return createExpensiveGraph(key);
         }
       });

此外,Guava的10.0版本引入了更广泛的com.google.common.cache软件包(有一个很好的wiki条目介绍如何使用它们)。