我正在寻找Java内存中对象缓存API。有什么建议?你过去使用过什么解决方案?
现在,我只是使用地图:
Map cache = new HashMap<String, Object>();
cache.put("key", value);
我需要扩展缓存以包含以下基本功能:
但是,我不需要更复杂的功能,如:
内存中缓存:
企业缓存:
答案 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)
我非常喜欢MapMaker
(Google 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/需要单独的进程作为缓存服务器,但功能强大。