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. :) –
- 1. Aktualisieren eines Databound ComboBox
- 2. Aktualisieren eines dynamischen Steuerelements
- 3. Aktualisieren eines vorhandenen Spaltenwerts
- 4. Aktualisieren eines DBML-Diagramms?
- 5. Aktualisieren eines iframe
- 6. Automatisches Aktualisieren eines Webbenutzersteuerelements
- 7. JDO - Aktualisieren eines Objekts
- 8. Aktualisieren eines PropertyGrid
- 9. Aktualisieren eines JS-Objekts
- 10. SQL - Aktualisieren eines Feldes
- 11. Dynamisches Aktualisieren eines Fragments
- 12. Das Image eines NSStatusItems aktualisieren
- 13. Aktualisieren eines Objekts in Realm
- 14. MongoDB - Aktualisieren eines verschachtelten Dokuments
- 15. LINQ: Aktualisieren eines unabhängigen Gitters
- 16. Erneutes Indizieren/Aktualisieren eines AbschnittsIndexer
- 17. Aktualisieren eines Java-Map-Eintrags
- 18. Aktualisieren eines Dokuments mit FindByIdAndUpdate
- 19. Aktualisieren eines Objekts mit Laravel
- 20. jquery (JQM) Aktualisieren eines Formularelements
- 21. Aktualisieren eines Antwortobjekts des Endpunkts
- 22. Aktualisieren eines Arrays mit Abfrage
- 23. Einfügen oder Aktualisieren eines Attributs eines Objekts in einem Array
- 24. Aktualisieren eines Teils eines Dokuments in Azure DocumentDB
- 25. Aktualisieren eines CouchDB-Dokuments in Nano
- 26. Aktualisieren eines ViewControllers mit der UITabBar-Anwendung
- 27. Aktualisieren eines Datensatzes mit Linq-to-SQL
- 28. Wie Aktualisieren eines Anfragesatzes, der annotiert wurde?
- 29. Swift - Aktualisieren von Werten eines multidimensionalen NSMutableDictionary
- 30. C# Thread sicher "Aktualisieren" Inhalt eines ConcurrentDictionary
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