轻量级Java对象缓存API

时间:2008-10-23 17:30:52

标签: java caching

问题

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

电流

现在,我只是使用地图:

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

要求

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

  • 最大尺寸
  • 生存时间

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

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

建议

内存中缓存:

  • Guava CacheBuilder - 积极开发。见presentation
  • LRUMap - 通过API配置。没有TTL。不是专门用于缓存的。
  • whirlycache - XML配置。邮件列表。上次更新2006年。
  • cache4j - XML配置。俄文文件。上次更新2006年。

企业缓存:

  • JCS - 属性配置。广泛的文档。
  • Ehcache - XML配置。丰富的文档。到目前为止,谷歌最受欢迎的是点击率。

7 个答案:

答案 0 :(得分:55)

EHCache非常好。您可以创建内存缓存。查看他们的code samples以获取创建内存缓存的示例。您可以指定最大尺寸和生存时间。

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小时。

答案 1 :(得分:43)

我非常喜欢MapMakerGoogle Guava)附带的API

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);
         }
       });

此外,番石榴10.0版本引入了更为广泛的com.google.common.cache package

答案 2 :(得分:9)

您还可以在以下位置查看名为KittyCache的小缓存库:

https://github.com/treeder/kitty-cache

与ehcache有一些性能基准。

它在SimpleJPA项目中用作二级缓存。

答案 3 :(得分:9)

Guava的MapMaker已被他们的CacheBuilder课程取代。

答案 4 :(得分:8)

您可以查看LinkedHashMap以实现没有第三方jar的简单缓存:

    Map <String, Foo> cache = new LinkedHashMap<String, Foo>(MAX_ENTRIES + 1, .75F, true) {

        public boolean removeEldestEntry(Map.Entry<String, Foo> eldest) {
            return size() > MAX_ENTRIES;
        }
    };

然后你可以从缓存中获取

    Foo foo = cache.get(key);
    if (foo == null && !cache.containsKey(key)) {
        try {
            FooDAO fooDAO = DAOFactory.getFooDAO(conn);
            foo = fooDAO.getFooByKey(key);
            cache.put(key, foo);
        } catch (SQLException sqle) {
            logger.error("[getFoo] SQL Exception when accessing Foo", sqle);
        }
    }

休息作为读者的练习:)

答案 5 :(得分:5)

JCS尝试并且是正确的。尽管就缓存机制而言它很轻松,但您可能会深入了解实际代码并模仿他们使用HashMap做什么,以确切地满足您的需求而不再需要。你似乎很清楚你在寻找什么。

答案 6 :(得分:3)

memcached拥有Java客户端。 http://www.danga.com/memcached/需要单独的进程作为缓存服务器,但功能强大。