Cache
refresh vs expire
Refresh and expire can exist at the same time. Entries queried with longer life than expire limit would trigger
load()
, and entries queried with longer life than refresh limit would triggerreload()
accordingly.When entry is expired,
get()
would triggerload()
and block untilload()
is complete.Entry runs
reload()
when its life is longer than refresh limit and gets invoked ofcall()
.Event entry gets
load()
orreload()
, the time they get into cache would not be updated.
public static void main(String[] args) throws InterruptedException {
LoadingCache<String, String> ca = Caffeine.newBuilder()
.expireAfterWrite(Duration.ofMillis(1000)) // Set to 800 to trigger load()
.refreshAfterWrite(Duration.ofMillis(800))
.build(new CacheLoader<String, String>() {
@Override
public @Nullable String load(String key) throws Exception {
return "load_" + key;
}
@Override
public @Nullable String reload(String key, String oldValue) throws Exception {
return "reload_" + key;
}
});
ca.put("a", "A");
int millisSleep = 300;
System.out.println("ca.get(\"a\") = " + ca.get("a"));
for (int i = 1; i <= 5; i++) {
System.out.println("millis: " + i * millisSleep);
Thread.sleep(millisSleep);
System.out.println("ca.get(\"a\") = " + ca.get("a"));
System.out.println("ca.get(\"a\") = " + ca.get("a"));
}
}
Last updated
Was this helpful?