API облегченного кеширования объектов Java

Вопрос

Я ищу API кэширования объектов в памяти Java. Какие-нибудь рекомендации? Какие решения вы использовали в прошлом?

Текущий

Прямо сейчас я просто использую карту:

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

Требования

Мне нужно расширить кеш, включив в него основные функции, такие как:

  • Максимальный размер
  • Время жить

Однако мне не нужны более сложные функции, такие как:

  • Доступ из нескольких процессов (кэширующий сервер)
  • Постоянство (на диск)

Предложения

Кэширование в памяти:

  • Гуава CacheBuilder - активная разработка. См. Этот презентация.
  • LRUMap - Конфиг через API. Нет TTL. Не предназначен для кеширования.
  • Whirlycache - XML-конфиг. Список рассылки. Последнее обновление 2006 г.
  • cache4j - XML-конфиг. Документация на русском языке. Последнее обновление 2006 г.

Кэширование предприятия:

  • JCS - Конфигурация свойств. Обширная документация.
  • Ehcache - XML-конфиг. Обширная документация. Безусловно, самый популярный по данным Google.

Можете ли вы отредактировать раздел кэширования предложений в памяти, чтобы включить кеш Guava? Я искал легкий механизм кэширования, как и вы, и нашел этот вопрос, но не нашел Guava, потому что он уже не работает. Теперь я использую кеш-пакет guava, и это УДИВИТЕЛЬНО.

andras 08.11.2011 16:12

Сделанный. :-) Очень рад, что вам понравилось!

Kevin Bourrillion 09.06.2012 02:42

Возможно, вы также захотите добавить относительно новый cache2k. На их страница тестов сказано, что он имеет гораздо лучшую производительность, чем ehcache и Guava.

user3001 25.02.2014 21:32

Попробуйте @Cacheable от jcabi-аспекты: yegor256.com/2014/08/03/cacheable-java-annotation.html

yegor256 12.09.2014 19:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
99
4
73 662
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

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 только на объект или вместо этого он сериализует, а затем десериализует объект?

Phương Nguyễn 22.05.2010 13:14

EHCache - тяжелое решение? Мы изучаем существующие решения для кэширования, чтобы реализовать кеширование API на Android.

Matthias 04.11.2010 17:11

Для Android это тяжеловато. Я использую Kitty cache, и он такой идеальный!

Felipe 08.10.2011 05:39

@Stevet K, я поздно узнал об этой технологии кеширования, но я думаю, что getInstance () был удален или изменен.

Menai Ala Eddine - Aladdin 09.05.2018 00:56

JCS проверено и верно. Несмотря на то, что механизмы кэширования невелики, вы можете покопаться в реальном коде и имитировать то, что они делают с HashMap, именно так, как вам нужно, и не больше. Кажется, вы довольно хорошо представляете, что ищете.

Я полагаю, вы имеете в виду, что это нет свет в том, что касается механизмов кеширования? Тем не менее, это одно из самых популярных корпоративных решений.

Chase Seibert 23.10.2008 22:06

Вы можете проверить 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-емкость. Тем не менее, это было бы неплохим началом для создания собственного.

Chase Seibert 23.10.2008 21:59

Да, я оставлю TTL как часть упражнения для читателя: p - и, конечно же, сторонние библиотеки будут протестированы гораздо больше, чем ваша собственная.

JeeBee 23.10.2008 22:11

Вы также можете проверить мою небольшую библиотеку кешей под названием KittyCache по адресу:

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

Есть несколько тестов производительности по сравнению с ehcache.

Он используется в проекте SimpleJPA как кеш второго уровня.

Хорошая, но лишь бы у нее есть TTL.

Rosdi Kasim 19.08.2011 04:47

Спасибо ! просто код, который я набирал, прежде чем подумал проверить, не открыл ли кто-нибудь что-то :)

jpillora 07.10.2012 17:06

@RosdiKasim у него действительно есть TTL при вызове put (), например: cache.put ("mykey", value, 500); 500 - это TTL.

Travis Reeder 01.11.2012 04:51

@TravisR Ну ... тогда у него не было TTL ..: p

Rosdi Kasim 05.11.2012 18:16

Ах, не понимал, как давно был этот комментарий.

Travis Reeder 13.11.2012 20:05

Мне очень нравится 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: спасибо, я добавил ссылку, не стесняйтесь предлагать отредактировать такие дополнения.

Joachim Sauer 04.11.2019 13:56

В memcached есть клиент для Java. http://www.danga.com/memcached/ Требуется отдельный процесс, чтобы быть кеширующим сервером, но мощная вещь.

Картограф Гуавы был заменен их классом CacheBuilder.

Другие вопросы по теме