2012-04-19 18 views
7

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

18

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.

+0

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? –

+0

Wenn ein Segment über 25 Einträge hinausgeht, wird der zuletzt verwendete Eintrag _in diesem Segment gelöscht._ –

+0

(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.) –