Ich implementiere einen Cache mit einer Map, die von LinkedHashMap erweitert wurde (damit kann ich removeEldestEntry implementieren). Die alte Implementierung verwendete eine reguläre Hash-Map, die in einem festgelegten Intervall aktualisiert wurde. Ich habe mich gefragt, wie ich die Daten im Cache aktuell halten kann. Ich bezweifle, dass ich zu einer bestimmten Zeit nur auffrischen kann, ohne den Punkt von LRU zu verderben. Wäre es besonders teuer, die DB nach einem Zeitstempel für den Eintrag abzufragen?Aktualisieren eines LRU-Caches
Antwort
Ich endete mit der LinkedHashMap, geordnet nach Zugriffszeit und Überprüfung gegen die db für Zeitstempel. Dies funktionierte wie ein Zauber und reduzierte die Speicherlast der Anwendung erheblich.
Warum nicht OS Cache verwenden - kein Sinn darin, das Rad neu zu erfinden.
Oder irgendein anderer Cache für diese Angelegenheit. Die meisten haben eine Zeit zu leben Einstellung –
Der Grund dafür ist, dass dies ein sehr altes Projekt ist und keiner der ursprünglichen Entwickler bleiben. Ich möchte vermeiden, neue Abhängigkeiten hinzuzufügen und nur eine einzelne Datei neu verkabeln. –
@Bobnix. Vielleicht, aber ich bin der Meinung, Sie sollten nicht schneiden. :) –
http://download.oracle.com/javase/1.4.2/docs/api/java/util/LinkedHashMap.html#removeEldestEntry%28java.util.Map.Entry%29 EldestEntry ist _numberbased_, nicht time- basierend. In LRU möchten Sie eine minimale Überlebenszeit - eine Beschränkung in der Zeit, EledestEntry begrenzt die Länge - eine Beschränkung in der Größe. Ich frage mich, wie planen Sie, LRU mit EldestEntry zu implementieren? – Nishant
@Nishant, hatte ich den Eindruck, dass LRU einfach regiert, was entfernt wurde, nicht wann. Wenn ich auf meine Größenbeschränkung stoße, möchte ich das Objekt entfernen, das zuletzt verwendet wurde. –
LRU - zuletzt verwendet, wie ich es kenne, sollte den ältesten Eintrag entfernen. Mit anderen Worten, Sie möchten das am häufigsten angeforderte Objekt entfernen. Nun, Ihr Hashmapping der Größe, sagen wir, 100 und das 100ste Element ist das am häufigsten verwendete, möchten Sie es entfernen? Es gibt zwei Escapes (1) verwenden Prioritätswarteschlange mit Priorität über den Zeitstempel entschieden, wenn das Objekt hinzugefügt wurde (2) Verwenden Sie LHM, aber jedes Mal, wenn get() aufgerufen wird, entfernen Sie den Eintrag und erneut in die Karte einfügen mimick LRU. – Nishant