Lekki interfejs API pamięci podręcznej obiektów Java [zamknięty]


99

Pytanie

Szukam interfejsu API buforowania obiektów w pamięci Java. Jakieś zalecenia? Z jakich rozwiązań korzystałeś w przeszłości?

obecny

W tej chwili używam tylko mapy:

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

Wymagania

Muszę rozszerzyć pamięć podręczną, aby zawierała podstawowe funkcje, takie jak:

  • największy rozmiar
  • Czas żyć

Jednak nie potrzebuję bardziej zaawansowanych funkcji, takich jak:

  • Dostęp z wielu procesów (serwer buforujący)
  • Trwałość (na dysk)

Propozycje

Buforowanie w pamięci:

  • Guava CacheBuilder - aktywny rozwój. Zobacz tę prezentację .
  • LRUMap - Konfiguracja przez API. Brak TTL. Nie jest przeznaczony do buforowania.
  • whirlycache - konfiguracja XML. Lista mailingowa. Ostatnia aktualizacja 2006.
  • cache4j - konfiguracja XML. Dokumentacja w języku rosyjskim. Ostatnia aktualizacja 2006.

Buforowanie korporacyjne:

  • JCS - Konfiguracja właściwości. Obszerna dokumentacja.
  • Ehcache - konfiguracja XML. Obszerna dokumentacja. Zdecydowanie najpopularniejszy według hitów Google.

3
Czy możesz edytować sekcję buforowania sugestii w pamięci, aby zawierała pamięć podręczną guawy? Szukałem lekkiego mechanizmu buforowania, takiego jak ty, i znalazłem to pytanie, ale nie znalazłem guawy, ponieważ jest znacznie niższa. Teraz używam pakietu pamięci podręcznej guawy i jest NIESAMOWITY.
andras

1
Gotowe. :-) Bardzo się cieszę, że Ci się podoba!
Kevin Bourrillion

Może chcesz również rozważyć dodanie stosunkowo nowego cache2k . Na ich stronie testów porównawczych mówi się, że ma znacznie lepszą wydajność niż ehcache i Guava.
user3001

Odpowiedzi:


57

EHCache jest bardzo fajny. Możesz utworzyć w pamięci podręcznej. Sprawdź ich przykłady kodu, aby zobaczyć przykład tworzenia w pamięci podręcznej. Możesz określić maksymalny rozmiar i czas życia.

EHCache oferuje zaawansowane funkcje, ale jeśli nie jesteś zainteresowany ich używaniem - nie rób tego. Ale miło jest wiedzieć, że tam są, jeśli Twoje wymagania kiedykolwiek się zmienią.

Oto w pamięci podręcznej. Utworzony w kodzie, bez plików konfiguracyjnych.

CacheManager cacheManager = CacheManager.getInstance();
int oneDay = 24 * 60 * 60;
Cache memoryOnlyCache = new Cache("name", 200, false, false, oneDay, oneDay);
cacheManager.addCache(memoryOnlyCache);

Tworzy pamięć podręczną, która pomieści 200 elementów i ma czas ttl wynoszący 24 godziny.


2
Czy EHCache po prostu odwołuje się do obiektu, czy też serializuje, a następnie deserializuje obiekt?
Phương Nguyễn

2
Czy EHCache to rozwiązanie wagi ciężkiej? Analizujemy istniejące rozwiązania buforowania, aby zaimplementować pamięć podręczną interfejsu API w systemie Android.
Matthias

2
Jest za ciężki dla Androida. Używam pamięci podręcznej Kitty i jest tak idealna!
Felipe

@Stevet K, spóźniłem się na poznanie tej technologii pamięci podręcznej, ale wydaje mi się, że getInstance () zostało usunięte lub zmienione.
Menai Ala Eddine - Aladdin

46

Naprawdę podoba mi się to, MapMakerco jest dostarczane z Google Guava ( API )

JavaDoc ma całkiem fajny przykład, który demonstruje zarówno łatwość użycia, jak i możliwości:

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

Co więcej, wydanie 10.0 programu Guava wprowadziło znacznie bardziej rozbudowany com.google.common.cachepakiet (jest ładny wpis wiki o tym, jak ich używać ).



@mxttie: dzięki, dodałem link, nie krępuj się zasugerować edycję takich dodatków.
Joachim Sauer

10

Możesz również sprawdzić moją małą bibliotekę pamięci podręcznej o nazwie KittyCache pod adresem:

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

Istnieją pewne testy wydajności w porównaniu z ehcache.

Jest używany w projekcie SimpleJPA jako pamięć podręczna drugiego poziomu.


1
Niezły, ale gdyby tylko miał TTL.
Rosdi Kasim,

Dzięki ! tylko kod, który pisałem, zanim pomyślałem, żeby sprawdzić, czy ktoś już coś otworzył :)
jpillora

@RosdiKasim faktycznie ma TTL przy wywołaniu put (), np .: cache.put ("mykey", wartość, 500); 500 to TTL.
Travis Reeder

1
@TravisR Cóż ..., wtedy nie miał TTL ..: p
Rosdi Kasim

Ach, nie zdawałem sobie sprawy, jak dawno temu był ten komentarz.
Travis Reeder

9

Możesz sprawdzić LinkedHashMap, aby zaimplementować prostą pamięć podręczną bez słoików innych firm:

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

następnie możesz pobrać z pamięci podręcznej, jak

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

reszta pozostawiona jako ćwiczenie dla czytelnika :)


2
Nie sądzę, aby ta metoda miała pojemność TTL. Byłby to jednak dobry początek w rozwijaniu własnego.
Chase Seibert,

Tak, zostawię rzeczy TTL jako część ćwiczenia czytelnika: p - i oczywiście biblioteki innych firm zostaną przetestowane znacznie częściej niż toczenie własnych.
JeeBee


5

JCS jest wypróbowany i prawdziwy. Mimo że jest lekki, jeśli chodzi o mechanizmy buforowania, możesz zagłębić się w rzeczywisty kod i naśladować to, co robią z HashMap pod osłonami, do dokładnie tego, czego potrzebujesz i nic więcej. Wygląda na to, że masz całkiem niezłe pojęcie o tym, czego szukasz.


Zakładam, że masz na myśli to, że nie jest lekki, jeśli chodzi o mechanizmy buforowania? Wydaje się jednak, że jest to jedno z najpopularniejszych rozwiązań dla przedsiębiorstw.
Chase Seibert,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.