Легкий JAVA Object Cache API [закрыт]



вопрос



Я ищу JAVA in-memory object caching API. Какие-нибудь рекомендации? Какие решения вы использовали в прошлом?



настоящее



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



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


требования



мне нужно увеличить кэш, чтобы включить основные функции, такие как:




  • максимальный размер

  • Время жить


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




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

  • стойкость (на диск)


предложения



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





  • гуавы CacheBuilder - активное развитие. Смотрите это презентация.


  • LRUMap - Config через API. Нет ТТЛ. Не специально построен для кэширования.


  • whirlycache - XML config. Рассылка список. Последнее обновление 2006.


  • cache4j - XML config. Документация на русском языке. Последнее обновление 2006.


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





  • JCS свойства конфигурации. Обширная документация.


  • Ehcache - XML config. Обширная документация. На сегодняшний день самые популярные по версии Google хиты.

622   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 часов.

мне очень нравится 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 пакета.

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

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

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

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

гуава это MapMaker был заменен на их CacheBuilder класса.

Вы можете проверить 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);
        }
    }

остальное оставил в качестве упражнения для читателя :)

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

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

Comments

    Ничего не найдено.