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

99

Вопрос

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

Текущий

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

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

Требования

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

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

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

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

Предложения

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

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

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

  • JCS - Конфигурация свойств. Обширная документация.
  • Ehcache - XML- конфиг . Обширная документация. Безусловно, самый популярный по данным Google.
Чейз Зайберт
источник
3
Можете ли вы отредактировать раздел кэширования предложений в памяти, чтобы включить кеш Guava? Я искал легкий механизм кеширования, как и вы, и нашел этот вопрос, но не нашел Guava, потому что он уже не работает. Теперь я использую кеш-пакет guava, и это УДИВИТЕЛЬНО.
andras
1
Готово. :-) Очень рад, что вам понравилось!
Кевин Бурриллион 08
Возможно, вы также захотите добавить относительно новый cache2k . На их странице тестов сказано, что он имеет гораздо лучшую производительность, чем ehcache и Guava.
user3001

Ответы:

57

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
Ссылается ли EHCache только на объект или вместо этого он сериализует, а затем десериализует объект?
Phng Nguyễn
2
EHCache - тяжелое решение? Мы изучаем существующие решения для кэширования, чтобы реализовать кеширование API на Android.
Матиас,
2
Для Android это тяжеловато. Я использую Kitty cache, и он такой идеальный!
Фелипе
@Stevet K, я поздно узнал об этой технологии кеширования, но я думаю, что getInstance () был удален или изменен.
Менай Ала Эддин - Аладдин
46

Мне очень нравится то, 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);
         }
       });

Кроме того, выпуск Guava 10.0 представил гораздо более обширный com.google.common.cacheпакет (есть хорошая вики-запись о том, как их использовать ).

Иоахим Зауэр
источник
@mxttie: спасибо, я добавил ссылку, не стесняйтесь предлагать редактировать такие дополнения.
Joachim Sauer
10

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

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

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

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

Трэвис Ридер
источник
1
Хорошая, но лишь бы у нее есть TTL.
Росди Касим
Спасибо ! просто код, который я набирал, прежде чем подумал проверить, не открыл ли кто-то уже что-то :)
jpillora
@RosdiKasim у него действительно есть TTL при вызове put (), например: cache.put ("mykey", value, 500); 500 - это TTL.
Travis Reeder
1
@TravisR Ну ... у него тогда не было TTL ..: p
Росди Касим
Ах, не понимал, как давно был этот комментарий.
Travis Reeder
9

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

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

JeeBee
источник
2
Я не думаю, что у этого метода есть TTL-емкость. Тем не менее, это было бы хорошим началом к ​​тому, чтобы катить свой собственный.
Чейз Зайберт,
Да, я оставлю TTL как часть упражнения для читателя: p - и, конечно же, сторонние библиотеки будут протестированы гораздо больше, чем ваша собственная.
JeeBee,
5

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

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

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

Зоркус
источник