Ich versuchte Guave Cache vor kurzem und war von Räumungsrichtlinien überrascht. Obwohl der Cache eindeutig als ein lu in Dokumenten angegeben ist, ist es nicht defacto. Für mich sieht die Räumung zufällig aus, wie mein Test zeigt. (Der Test besteht darin, 100 Etnries hinzuzufügen, 100 Einträge zu erhalten, verschiedene 100 Einträge einzutopfen, Räumungsbefehl zu überprüfen). Ich möchte in Runtime keine unerwarteten Räumungen feststellen. Könnten Sie bitte einen Hintergrund für die Räumungsrichtlinien für einen begrenzten Cache angeben? Wie kann ich Guava-Cache erzwingen, um wie LHM zu vertreiben?Guava Cache Räumungsrichtlinie
Antwort
Guava-Caches sind segmentiert in concurrencyLevel
verschiedene Hash-Tabellen, um mehrere gleichzeitige Lese- und Schreibvorgänge zu ermöglichen. Der Standard concurrencyLevel
ist 4. Grundsätzlich, wenn Ihr maximumSize
-100
gesetzt, so dass eigentlich nur die Ergebnisse in jedem der vier Segmente eine maximumSize
von 25 bekommen Aus diesem Grund ist die maximumSize
Dokumentation heißt es:
Beachten Sie, dass die Cache kann einen Eintrag löschen, bevor dieses Limit überschritten wird. Wenn die Cachegröße nahe am Maximum wächst, entfernt der Cache Einträge, die mit geringerer Wahrscheinlichkeit erneut verwendet werden.
Also, wenn durch Zufall, 30 Einträge waren, die in einem bestimmten Segment ging, dann 5 dieser Einträge werden geräumt bekommen.
Die einzige Möglichkeit, die globale Least-recently-reactored-Entfernung für eine Cache
zu erhalten, besteht darin, die Nebenläufigkeit vollständig zu deaktivieren, indem concurrencyLevel(1)
festgelegt wird. Selbst dann, die Dokumentation macht keine Garantien auf die Räumungsreihenfolge von Elementen, und Sie sollten nicht davon abhängen.
- 1. Guava Ticker Cache
- 2. Guava Cache geben Fehler
- 3. guava cache vs ehcache benchmark
- 4. Guava Cache ‚expireAfterWrite‘ scheint nicht immer
- 5. Benutzerdefinierte equals/hash beim Einfügen von Schlüssel (Guava Cache)
- 6. Guava Sets.intersection schlechte Leistung
- 7. Guava CacheBuilder maximumSize
- 8. Standardablauf von Google Guava Caching
- 9. Statische Schlüssel in Google Guava
- 10. Guava Funktionsargumente
- 11. Betragen Guava-Caches Gewicht in Räumungsentscheidungen?
- 12. Guava CacheBuilder ruft den Entfernungslistener nicht an
- 13. Problem mit Running Guava
- 14. Guava EventBus Komponententests
- 15. Guava ImmutableMap Builder Syntax
- 16. Wie man Guava mappt.newConcurrentMap()
- 17. Sortieren einer Guava BiMap
- 18. Trie Implementierung in Guava?
- 19. Guava-Parallelitäts-Tutorials/Code
- 20. Guava-Tabelle zu CSV
- 21. Guava Eventbus funktioniert nicht
- 22. Guava-Bibliotheken und GWT
- 23. Guava: java.lang.NoClassDefFoundError - com.google.common.collect.HashBiMap
- 24. Guava EventBus Dispatching
- 25. Guava: Wo ist CharEscaper?
- 26. Guava-Cache: Wie setze ich den Ablauf auf 'CacheLoader.load()' statt während CacheBuilder.newBuilder()?
- 27. Wie lautet die standardmäßige maximale Größe für einen Google Guava Cache?
- 28. ungültig aktualisiert Eintrag in Guava CacheLoader
- 29. Guava CacheBuilder und speichern Schlüssel unterscheidet sich von Lookup-Schlüssel
- 30. Gewindesichere HashSet mit Guava Collections
Danke für die Antwort Louis. Für mich war es unklar, wie diese Dokumentation zu behandeln ist. Also weniger ConcurrencyLevel = mehr LRU. Aber ich habe immer noch mit der Räumung auf Segmentebene verwechselt. Bin ich richtig, wenn ein Segment voll wird, sagen wir> 25 (100/4) in meinem Fall, wird die Räumung beginnen? oder es wird nur bei ~ maxSize geräumt, aber wird eine Segment-Ebene durch den Eintrag vertreiben? –
Wenn ein Segment über 25 Einträge hinausgeht, wird der zuletzt verwendete Eintrag _in diesem Segment gelöscht._ –
(Grundsätzlich arbeitet jedes Segment mehr oder weniger vollständig unabhängig voneinander, sodass sie gleichzeitig verwendet werden können, ohne sich gegenseitig zu blockieren.) –