Kennt jemand von Ihnen eine Java Map oder einen ähnlichen Standarddatenspeicher, der Einträge nach einer bestimmten Zeit automatisch löscht? Dies bedeutet Altern, bei dem die alten abgelaufenen Einträge automatisch "altern".
Am besten in einer Open-Source-Bibliothek, auf die über Maven zugegriffen werden kann?
Ich kenne Möglichkeiten, die Funktionalität selbst zu implementieren, und habe dies in der Vergangenheit mehrmals getan. Daher bitte ich diesbezüglich nicht um Rat, sondern um Hinweise auf eine gute Referenzimplementierung.
WeakReference- basierte Lösungen wie WeakHashMap sind keine Option, da meine Schlüssel wahrscheinlich nicht internierte Zeichenfolgen sind und ich ein konfigurierbares Zeitlimit möchte, das nicht vom Garbage Collector abhängig ist.
Ehcache ist auch eine Option, auf die ich mich nicht verlassen möchte, da externe Konfigurationsdateien erforderlich sind. Ich suche nach einer Nur-Code-Lösung.
quelle
Antworten:
Ja. Google Collections oder Guava, wie es heißt, hat jetzt MapMaker, das genau das kann.
Aktualisieren:
Ab Guava 10.0 (veröffentlicht am 28. September 2011) sind viele dieser MapMaker-Methoden zugunsten des neuen CacheBuilder veraltet :
quelle
weakKeys()
impliziert, dass Schlüssel mit der == -Semantik verglichen werden, nichtequals()
. Ich habe 30 Minuten verloren, um herauszufinden, warum mein Cache mit String-Schlüssel nicht funktioniert hat :)weakKeys()
ist wichtig.weakKeys()
ist in 90% der Fälle nicht erforderlich.Dies ist eine Beispielimplementierung, die ich für die gleiche Anforderung durchgeführt habe, und die Parallelität funktioniert gut. Könnte für jemanden nützlich sein.
Git Repo Link (mit Listener-Implementierung)
https://github.com/vivekjustthink/WeakConcurrentHashMap
Prost!!
quelle
cleanMap()
Hälfte der angegebenen Zeit aus?Sie können meine Implementierung einer selbst ablaufenden Hash-Map ausprobieren . Diese Implementierung verwendet keine Threads, um abgelaufene Einträge zu entfernen, sondern verwendet DelayQueue , das bei jedem Vorgang automatisch bereinigt wird.
quelle
Apache Commons hat einen Dekorator für Map, mit dem Einträge ablaufen: PassiveExpiringMap Es ist einfacher als Caches aus Guava.
PS Vorsicht, es ist nicht synchronisiert.
quelle
Klingt so, als ob ehcache für das, was Sie wollen, übertrieben ist. Beachten Sie jedoch, dass keine externen Konfigurationsdateien erforderlich sind.
Es ist im Allgemeinen eine gute Idee, die Konfiguration in deklarative Konfigurationsdateien zu verschieben (Sie müssen also nicht neu kompilieren, wenn für eine neue Installation eine andere Ablaufzeit erforderlich ist), dies ist jedoch überhaupt nicht erforderlich. Sie können sie dennoch programmgesteuert konfigurieren. http://www.ehcache.org/documentation/user-guide/configuration
quelle
Google-Sammlungen (Guave) verfügen über den MapMaker, in dem Sie das Zeitlimit (für den Ablauf) festlegen und bei der Auswahl mithilfe einer Factory-Methode weiche oder schwache Referenzen verwenden können, um Instanzen Ihrer Wahl zu erstellen.
quelle
Sie können Expiring Map http://www.java2s.com/Code/Java/Collections-Data-Structure/ExpiringMap.htm als Klasse aus dem Apache MINA-Projekt ausprobieren
quelle
Wenn jemand eine einfache Sache braucht, folgt ein einfacher Satz, dessen Schlüssel abläuft. Es kann leicht in eine Karte konvertiert werden.
quelle
System.nanoTime()
Erwägen Sie außerdem die Verwendung zur Berechnung von Zeitunterschieden, da System.currentTimeMillis () nicht konsistent ist, da es von der Systemzeit abhängt und möglicherweise nicht kontinuierlich ist.In der Regel sollte ein Cache Objekte einige Zeit aufbewahren und einige Zeit später verfügbar machen. Was ein guter Zeitpunkt ist, um ein Objekt zu halten, hängt vom Anwendungsfall ab. Ich wollte, dass dieses Ding einfach ist, keine Threads oder Scheduler. Dieser Ansatz funktioniert bei mir. Im Gegensatz zu
SoftReference
s ist für Objekte eine Mindestdauer garantiert. Sie bleiben jedoch nicht in Erinnerung, bis sich die Sonne in einen roten Riesen verwandelt .Stellen Sie sich als Verwendungsbeispiel ein langsam reagierendes System vor, das in der Lage sein soll, zu überprüfen, ob eine Anforderung erst vor kurzem ausgeführt wurde, und in diesem Fall die angeforderte Aktion nicht zweimal auszuführen, selbst wenn ein hektischer Benutzer mehrmals auf die Schaltfläche drückt. Wenn dieselbe Aktion jedoch einige Zeit später angefordert wird, muss sie erneut ausgeführt werden.
quelle
Der Guaven-Cache ist einfach zu implementieren. Mit dem Guaven-Cache können wir den Schlüssel zeitlich ablaufen lassen. Ich habe den Beitrag vollständig gelesen und unten den Schlüssel meiner Studie angegeben.
Referenz: Beispiel für einen Guaven-Cache
quelle