Легкий API кэша объектов Java
Вопрос
Я ищу API-интерфейс кэширования объектов Java в памяти. Любые рекомендации? Какие решения вы использовали в прошлом?
Current
Сейчас я просто использую карту:
Map cache = new HashMap<String, Object>();
cache.put("key", value);
Требования
Мне нужно расширить кеш, чтобы включить основные функции, такие как:
- Максимальный размер
- Время жить
Однако мне не нужны более сложные функции, такие как:
- Доступ из нескольких процессов (сервер кеширования)
- Сохранение (на диск)
Предложения
Кэширование в памяти:
- Guava CacheBuilder - активная разработка. Смотрите презентация.
- LRUMap - Конфигурировать через API. Нет TTL. Не предназначено для кэширования.
- whirlycache - Конфигурация XML. Список рассылки. Последнее обновление 2006 года.
- cache4j - Конфигурация XML. Документация на русском языке. Последнее обновление 2006 года.
Корпоративное кэширование:
- JCS - Свойства config. Обширная документация.
- Ehcache - Конфигурация XML. Обширная документация. Безусловно, самые популярные в соответствии с хитами Google.
Ответы
Ответ 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
Мне очень нравится MapMaker
, который поставляется с Google Collections (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 из Guava представил гораздо более обширный com.google.common.cache
пакет.
Ответ 3
Вы также можете проверить мою небольшую библиотеку кэша под названием KittyCache по адресу:
https://github.com/treeder/kitty-cache
Есть несколько тестов производительности против ehcache.
Он использовался в проекте SimpleJPA как кеш второго уровня.
Ответ 4
Guava MapMaker заменен на CacheBuilder.
Ответ 5
Вы можете проверить LinkedHashMap для реализации простого кеша без сторонних баннеров:
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);
}
}
оставлено в качестве упражнения для читателя:)
Ответ 6
JCS испробовано и верно. Несмотря на то, что механизмы кэширования легки, вы можете вникать в реальный код и имитировать то, что они делают с HashMap под обложками, чтобы точно то, что вам нужно, и не более того. У вас, похоже, довольно хорошее представление о том, что вы ищете.
Ответ 7
memcached имеет клиент для Java. http://www.danga.com/memcached/ Требуется, чтобы отдельный процесс был кеширующим сервером, но мощным.