2011-10-13 39 views
7

Potrzebuję Map (lub dowolnej kolekcji), która obsługuje czas do zwolnienia dla wpisów i usuwa je automatycznie.Mapa z automatycznie wygasającymi elementami

Wiem, że jest guawa MapMaker, ale wygasa jego elementy w kolejnych operacjach odczytu/zapisu, a nie automatycznie, przez bieżący wątek. Ponadto możliwości wygaśnięcia MapMaker są teraz przenoszone do CacheBuilder. Chodzi o to, że nie chcę pamięci podręcznej - chcę wygasić elementy

Czy jest coś gotowego do użycia? (To nie jest trudne do wdrożenia to sam, ale lepiej użyć ponownie coś)

+0

Czy potrzebujesz elementy jakoś wyraźnie „die” (na przykład poprzez wywołanie niektóre metody) na czas? Jeśli po prostu trzeba wyrzucić wygasłe elementy, sprawdzanie znaczników czasu elementów w czasie dostępu powinno wystarczyć. – 9000

+1

Możesz mieć uruchomiony wątek okresowo wywołujący Cache.cleanup() w celu wywołania eksmisji wygasłych wpisów. Chociaż nie jest to natychmiastowe, wewnętrzny wątek ma zbyt wiele ograniczeń (nie jest zgodny z J2EE/GAE, cierpi z powodu efektu psa, itp.). –

+0

@Ben Manes dzięki za sugestię. Jednak nie podoba mi się interfejs Cache. Po pierwsze, wymusza to wyliczanie wartości. Nie potrzebuję tego. Jeśli zwrócę wartość NULL, spowoduje to NPE. To dlatego, że zawsze wywołuje funkcję getOrCompute, a ja potrzebuję po prostu uzyskać - jak prostą mapę. Wtedy, nawet przy wychwytywaniu NPE, nie mogłem sprawić, żeby działało (być może moja wina), ale zawsze wygasało wpisy, mimo że były dostępne. – Bozho

Odpowiedz

2

Może: http://code.google.com/p/concurrentlinkedhashmap/wiki/ExpirableCache
Raczej nie ... ma wiele nierozwiązanych importu.

+0

Dobrze, sprawdzę to jutro – Bozho

+0

To jest (stary) pokazowy samouczek zamiast dostarczonej biblioteki, więc nierozwiązany import wydawał się sprawiedliwy. To naiwne i wspólne podejście. Wolę amortyzowane podejście, które dodaliśmy do Guawy, ponieważ pozwala uniknąć stęchłych zdarzeń. –

2

Jeśli nie masz nic innego, możesz dostarczyć manekina CacheLoader, który po prostu wyrzuca wyjątki, a następnie po prostu nie dzwoń pod numer Cache.get - wchodzi w interakcję tylko z widokiem asMap. To nie jest ładne, ale staramy się wesprzeć tę sprawę lepiej w 11.0. Upewnij się, że masz Guava 10.0.1, jeśli spróbujesz tego.

I tak, Cache.cleanUp jest tam, aby dzwonić tak często, jak chcesz z dowolnych wątków, które chcesz.

+0

próbowałem tego, ale interakcje widoku 'asMap' nie odświeżają ostatniego dostępu. – Bozho

0

Polecam używać Map że Hazelcast przewiduje. Zapewnia także możliwości dystrybucji, ale może ich nie interesuje. Musisz tylko skonfigurować wygasającą polisę (time-to-live-seconds i max-idle-seconds) i użyć wartości Map, tak jakby była to Java HashMap.

Więcej informacji można znaleźć tutaj: Hazelcast Distributed Map