2017-09-10 4 views
1

Ich habe dieses Dokument gelesen, das Guava Cache erklärt: . Ich verstehe, was refreshAfterWrite und expireAfterWrite tun. Bei der Erläuterung von refreshAfterWrite erwähnt das Dokument dies jedoch:Guava LoadingCache: Warum refreshAfterWrite und expireAfterWrite zusammen verwenden

"So können Sie beispielsweise refreshAfterWrite und expireAfterWrite für denselben Cache angeben, so dass der Ablauftimer für einen Eintrag nicht blind zurückgesetzt wird, wenn ein Der Eintrag wird für eine Aktualisierung zugelassen, dh wenn ein Eintrag nicht abgefragt wird, nachdem er für eine Aktualisierung in Frage kommt, darf er ablaufen.

Dies ist der Teil, der mich verwirrt. Wenn Sie möchten, dass ein Schlüssel automatisch aktualisiert wird, müssen Sie lediglich refreshAfterWrite angeben. Warum möchten wir expireAfterWrite überhaupt verwenden, wenn refreshAfterWrite verwendet wird?

Antwort

2

Es gibt Szenarios, in denen die zwischengespeicherten Einträge relevant sein sollen, sodass Sie eine Aktualisierungsdauer festlegen (die leichter auszuführen ist (und asynchron), statt einer vollständigen Abruf nach der Räumung und daher anders). Aber wenn Ihr Cache begrenzt ist, sollten Sie Einträge löschen, dafür steht expireAfterWrite. Wenn Sie beide Einstellungen festlegen, stellen Sie sicher, dass ein Eintrag nach einer bestimmten Zeit gelöscht wird, selbst wenn er aktualisiert wurde.

Beachten Sie auch, dass beide unterscheidet sich in der Art, wie sie arbeiten, sind:

Refreshing ist nicht ganz dasselbe wie Vertreibung. Wie in LoadingCache.refresh (K) angegeben, wird beim Aktualisieren eines Schlüssels ein neuer Wert für den Schlüssel möglicherweise asynchron geladen. Der alte Wert (falls vorhanden) wird immer noch zurückgegeben, während der Schlüssel aktualisiert wird, im Gegensatz zur Räumung, die das Abrufen erzwingt, bis der Wert erneut geladen wird.

+0

Sinn machen. Aber ich habe auch diese Frage: Wenn ich nur expireAfterWrite() benutze, sollte es auch reichen, oder? expireAfterWrite() entfernt alte Einträge. Immer wenn ich get() anrufe, wird entweder ein neuer Wert, der vom Cache oder Wert im Cache geladen wurde, abhängig davon, ob der Wert abgelaufen ist oder nicht, zu mir zurückkehren. Das Dokument, das refreshAfterWrite() erklärt, sagt dies ** eine Aktualisierung wird nur dann initiiert, wenn der Eintrag abgefragt wird **. Also, was ist der Sinn von refreshAfterWrite()? Kannst du mir ein Beispiel geben? –

+0

Die Aktualisierungsoperation könnte leichter (und asynchron) als eine vollständige Abrufoperation nach der Räumung sein. Ich habe diese Notiz dem Antworttext hinzugefügt. –

+0

Eine Aktualisierung wird den Schreibzeitstempel des Ablaufs zurücksetzen. Die Absicht ist, dass einige Einträge sehr heiß sein können, und wenn sie ablaufen, gibt es eine für den Benutzer sichtbare Latenzzeit, wenn Anrufer für das Laden blockieren. Durch die Aktualisierung können aktive Einträge erneut geladen werden, ohne dass diese Kosten entstehen. Wenn sie inaktiv ist, wird das Ablaufdatum eingefügt und entfernt. –

Verwandte Themen