Легкий 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 как кеш второго уровня.

Ответ 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/ Требуется, чтобы отдельный процесс был кеширующим сервером, но мощным.