Czy ktoś z was zna mapę Java lub podobny standardowy magazyn danych, który automatycznie usuwa wpisy po upływie określonego czasu? Oznacza to starzenie się, w którym stare wygasłe wpisy automatycznie „wygasają”.
Najlepiej w bibliotece open source, która jest dostępna za pośrednictwem Maven?
Znam sposoby samodzielnego wdrożenia tej funkcji i robiłem to już kilka razy w przeszłości, więc nie proszę o radę w tym zakresie, ale o wskazówki dotyczące dobrej implementacji referencyjnej.
Rozwiązania oparte na WeakReference , takie jak WeakHashMap, nie są opcją, ponieważ moje klucze prawdopodobnie są ciągami nie internowanymi i chcę konfigurowalnego limitu czasu, który nie zależy od śmieciarza.
Ehcache to także opcja, na której nie chciałbym polegać, ponieważ potrzebuje zewnętrznych plików konfiguracyjnych. Szukam rozwiązania tylko do kodu.
źródło
Odpowiedzi:
Tak. Kolekcje Google lub Guava, jak się nazywa, ma teraz coś o nazwie MapMaker, który może to zrobić dokładnie.
Aktualizacja:
Od wersji guava 10.0 (wydanej 28 września 2011 r.) Wiele z tych metod MapMaker zostało wycofanych na korzyść nowego CacheBuilder :
źródło
weakKeys()
oznacza, że klucze są porównywane przy użyciu semantyki ==, a nieequals()
. Straciłem 30 minut, zastanawiając się, dlaczego moja pamięć podręczna z kluczem nie działa :)weakKeys()
jest ważna.weakKeys()
nie jest wymagane 90% czasu.To jest przykładowa implementacja, którą zrobiłem dla tego samego wymagania, a współbieżność działa dobrze. Może być przydatny dla kogoś.
Git Repo Link (z implementacją Listener)
https://github.com/vivekjustthink/WeakConcurrentHashMap
Twoje zdrowie!!
źródło
cleanMap()
połowę określonego czasu?Możesz wypróbować moją implementację wygasającej mapy skrótów. Ta implementacja nie wykorzystuje wątków do usuwania wygasłych wpisów, zamiast tego używa DelayQueue, która jest czyszczona automatycznie przy każdej operacji.
źródło
Apache Commons ma dekoratora dla Map, aby wygasać wpisy: PassiveExpiringMap To jest prostsze niż skrzynki z Guawy .
PS bądź ostrożny, nie jest zsynchronizowany.
źródło
Wygląda na to, że ehcache przesadza z tym, czego chcesz, jednak pamiętaj, że nie potrzebuje zewnętrznych plików konfiguracyjnych.
Zasadniczo dobrym pomysłem jest przeniesienie konfiguracji do deklaratywnych plików konfiguracyjnych (więc nie ma potrzeby ponownej kompilacji, gdy nowa instalacja wymaga innego czasu wygaśnięcia), ale nie jest to wcale wymagane, nadal można ją skonfigurować programowo. http://www.ehcache.org/documentation/user-guide/configuration
źródło
Kolekcje Google (guava) mają MapMakera, w którym możesz ustawić limit czasu (do wygaśnięcia) i możesz użyć miękkiego lub słabego odniesienia, wybierając metodę fabryczną, aby utworzyć wybrane instancje.
źródło
możesz wypróbować wygasającą mapę http://www.java2s.com/Code/Java/Collections-Data-Structure/ExpiringMap.htm klasę z projektu Apache MINA
źródło
Jeśli ktoś potrzebuje prostej rzeczy, to prosty zestaw, który traci ważność. Można go łatwo przekonwertować na mapę.
źródło
System.nanoTime()
do obliczania różnic czasowych, ponieważ System.currentTimeMillis () nie jest spójny, ponieważ zależy od czasu systemowego i może nie być ciągły.Zazwyczaj pamięć podręczna powinna przechowywać obiekty przez pewien czas i ujawniać je później. To, kiedy najlepiej trzymać przedmiot, zależy od przypadku użycia. Chciałem, żeby to było proste, bez wątków i harmonogramów. To podejście działa dla mnie. W przeciwieństwie do
SoftReference
s, obiekty są gwarantowane przez pewien minimalny czas. Nie pozostają jednak w pamięci, dopóki słońce nie zmieni się w czerwonego olbrzyma .Jako przykład użycia pomyśl o wolno reagującym systemie, który będzie w stanie sprawdzić, czy żądanie zostało wykonane całkiem niedawno, iw takim przypadku nie wykona żądanego działania dwa razy, nawet jeśli gorączkowy użytkownik kliknie przycisk kilka razy. Ale jeśli jakiś czas później zażąda się tego samego działania, należy je wykonać ponownie.
źródło
Pamięć podręczna guava jest łatwa do wdrożenia. Klucz wygasa na podstawie czasu, korzystając z pamięci podręcznej guava. Przeczytałem w pełni post i poniżej daje klucz do moich badań.
Odniesienie: przykład pamięci podręcznej guava
źródło