Я ищу API кэширования объектов в памяти Java. Какие-нибудь рекомендации? Какие решения вы использовали в прошлом?
Прямо сейчас я просто использую карту:
Map cache = new HashMap<String, Object>();
cache.put("key", value);
Мне нужно расширить кеш, включив в него основные функции, такие как:
Однако мне не нужны более сложные функции, такие как:
Кэширование в памяти:
Кэширование предприятия:
Сделанный. :-) Очень рад, что вам понравилось!
Возможно, вы также захотите добавить относительно новый cache2k. На их страница тестов сказано, что он имеет гораздо лучшую производительность, чем ehcache и Guava.
Попробуйте @Cacheable от jcabi-аспекты: yegor256.com/2014/08/03/cacheable-java-annotation.html




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 часам.
Ссылается ли EHCache только на объект или вместо этого он сериализует, а затем десериализует объект?
EHCache - тяжелое решение? Мы изучаем существующие решения для кэширования, чтобы реализовать кеширование API на Android.
Для Android это тяжеловато. Я использую Kitty cache, и он такой идеальный!
@Stevet K, я поздно узнал об этой технологии кеширования, но я думаю, что getInstance () был удален или изменен.
JCS проверено и верно. Несмотря на то, что механизмы кэширования невелики, вы можете покопаться в реальном коде и имитировать то, что они делают с HashMap, именно так, как вам нужно, и не больше. Кажется, вы довольно хорошо представляете, что ищете.
Я полагаю, вы имеете в виду, что это нет свет в том, что касается механизмов кеширования? Тем не менее, это одно из самых популярных корпоративных решений.
Вы можете проверить 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);
}
}
остальное оставлено как упражнение для читателя :)
Я не думаю, что у этого метода есть TTL-емкость. Тем не менее, это было бы неплохим началом для создания собственного.
Да, я оставлю TTL как часть упражнения для читателя: p - и, конечно же, сторонние библиотеки будут протестированы гораздо больше, чем ваша собственная.
Вы также можете проверить мою небольшую библиотеку кешей под названием KittyCache по адресу:
https://github.com/treeder/kitty-cache
Есть несколько тестов производительности по сравнению с ehcache.
Он используется в проекте SimpleJPA как кеш второго уровня.
Хорошая, но лишь бы у нее есть TTL.
Спасибо ! просто код, который я набирал, прежде чем подумал проверить, не открыл ли кто-нибудь что-то :)
@RosdiKasim у него действительно есть TTL при вызове put (), например: cache.put ("mykey", value, 500); 500 - это TTL.
@TravisR Ну ... тогда у него не было TTL ..: p
Ах, не понимал, как давно был этот комментарий.
Мне очень нравится 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 Guava представил гораздо более обширный com.google.common.cache пакет (есть хорошая статья в вики о том, как их использовать).
@mxttie: спасибо, я добавил ссылку, не стесняйтесь предлагать отредактировать такие дополнения.
В memcached есть клиент для Java. http://www.danga.com/memcached/ Требуется отдельный процесс, чтобы быть кеширующим сервером, но мощная вещь.
Картограф Гуавы был заменен их классом CacheBuilder.
Можете ли вы отредактировать раздел кэширования предложений в памяти, чтобы включить кеш Guava? Я искал легкий механизм кэширования, как и вы, и нашел этот вопрос, но не нашел Guava, потому что он уже не работает. Теперь я использую кеш-пакет guava, и это УДИВИТЕЛЬНО.