/ / Google Guave Cachebuilder verwenden mehr Zeit zwischen exipreAfterAccess und expireActerWrite - Java, Sammlungen, Guave, Concurrenthashmap

Google Guave Cachebuilder verwenden mehr Zeit zwischen exipreAfterAccess und expireActerWrite - Java, Sammlungen, Guave, Concurrenthashmap

Zuerst apolozige ich, wenn ich mich nicht an irgendwelche Regeln und Vorschriften von stackoverflow halte, da ich eine Frage zum ersten Mal poste.

Ich bin in einer Situation, in der ich ablauffähig verwenden mussKarte, wo Elemente aus der Karte nach einer bestimmten Zeit automatisch gelöscht werden können. Ich bin froh, dass ich cachebuilder von Google Guava verwenden kann. Ich muss ein Standardzeitlimit angeben, das ich mit expireAfterWrite (..) ausführen kann, aber ich muss es nach meinem Zugriff überschreiben. Ich kann exipreAfterAccess (..) verwenden, aber es entfernt es immer noch nach der anfänglichen Zeit von exipreAfterWrite (..)

Wie kann ich diese Funktionalität erreichen, so dass die Entfernungskriterien einen größeren Zeitraum zwischen exipreAfterAccess und expireActerWrite überprüfen

Danke, dass du dir das angeschaut hast

Antworten:

2 für die Antwort № 1

Ich würde nur raten, das nicht zu setzen expireAfterWrite Wert. Dies wird genau das erreichen, was Sie wollen.

Siehe kleines Beispiel unten.

  1. Es veranschaulicht zunächst Ihre aktuelle Situation (expireAfterWrite = 1 Sekunde, expireAfterAccess = 2 Sekunden) -> Jede Sekunde wird der Wert neu geladen
  2. Es erstellt dann einen Cache mit nur (expireAfterAccess = 2 Sekunden) und greift alle 100ms darauf zu -> Wert wird nur einmal geladen
  3. Es schläft dann für 2 Sekunden -> Wert wird ordnungsgemäß neu geladen.

import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

import com.google.common.base.Stopwatch;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

public class TestCache {

private static final String KEY = "Key";

public static void main(String[] args) throws ExecutionException, InterruptedException {
CacheLoader<String, String> loader = new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
System.out.println("Loading key");
return key;
}
};
LoadingCache<String, String> cache1 = CacheBuilder.newBuilder().expireAfterAccess(2L, TimeUnit.SECONDS)
.expireAfterWrite(1L, TimeUnit.SECONDS).build(loader);
cache1.get(KEY); // First write
testCache(cache1);
LoadingCache<String, String> cache2 = CacheBuilder.newBuilder().expireAfterAccess(2L, TimeUnit.SECONDS).build(loader);
testCache(cache2);
System.out.println("Final test on cache 2");
Thread.sleep(2001);
System.out.println(cache2.get(KEY));

}

private static void testCache(LoadingCache<String, String> cache1) throws ExecutionException, InterruptedException {
Stopwatch sw = Stopwatch.createStarted();
while (sw.elapsed(TimeUnit.SECONDS) < 5) {
System.out.println(sw.elapsed(TimeUnit.MILLISECONDS) + " " + cache1.get(KEY));
Thread.sleep(100);
}
}
}