Легкий 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
Зроблено. :-) Дуже радий, що тобі це подобається!
Кевін Бурліон

Можливо, ви також хочете розглянути можливість додавання відносно нового 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 на об’єкт або він замість цього серіалізує та десеріалізує об'єкт?
Пханг Нгуйен

2
Є EHCache важким рішенням? Ми розглядаємо існуючі рішення для кешування для реалізації кешу API на Android.
Маттіас

2
Це занадто важко для Android. Я використовую кеш Kitty, і це так ідеально!
Феліпе

@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);
         }
       });

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



@mxttie: дякую, я додав посилання, не соромтесь запропонувати редагувати такі доповнення.
Йоахім Зауер

10

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

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

Існують деякі показники ефективності порівняно з ehcache.

Він використовується в проекті SimpleJPA як кеш другого рівня.


1
Хороший, але якщо тільки він має TTL.
Росді Касім

Дякую ! просто код, який я набирав, перш ніж я подумав перевірити, чи хтось уже відкрив щось із джерела :)
jpillora

@RosdiKasim у нього є TTL фактично під час виклику put (), наприклад: cache.put ("mykey", значення, 500); 500 - це TTL.
Тревіс Редер

1
@TravisR Ну ..., тоді не було TTL тоді ..: p
Росді Касім

Ага, не зрозумів, як давно цей коментар.
Тревіс Редер

9

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

відпочинок залишився як вправа для читача :)


2
Я не думаю, що цей метод має потенціал TTL. Хоча це було б гарним початком до прокатки власних.
Чейз Сейберт

Так, я залишу TTL речі як частину вправи для читання: p - і, звичайно, сторонні лібки будуть перевірені набагато більше, ніж прокатка власних.
JeeBee


5

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


Я припускаю, ви маєте на увазі, що це не світло, наскільки механізми кешування? Здається, це одне з найпопулярніших рішень для підприємств.
Чейз Сейберт

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.