2014-09-24 9 views
10
private Cache<Long, Response> responseCache = CacheBuilder.newBuilder() 
      .maximumSize(10000) 
      .expireAfterWrite(10, TimeUnit.MINUTES) 
      .build(); 

arbeitet Ich erwarte, dass Response-Objekte, die nicht innerhalb von 10 Minuten zum Client senden sind abgelaufen und aus dem Cache automatisch entfernt, aber ich merke, dass Response-Objekte sind nicht immer abgelaufen immer auch nach 10, 15, 20 Minuten. Sie werden ablaufen, wenn der Cache in großen Zahlen gefüllt wird, aber wenn das System inaktiv wird, etwa die letzten 500 Antwortobjekte, hört es auf, diese Objekte zu entfernen. Kann jemand helfen, dieses Verhalten zu verstehen? DankeGuava Cache ‚expireAfterWrite‘ scheint nicht immer

+0

https://code.google.com/p/guava-libraries/wiki/CachesExplained#When_Does_Cleanup_Happen%3F –

+0

Großartig, danke – Mark1234

Antwort

15

Dies wird in der Dokumentation angegeben:

Wenn expireAfterWrite oder expireAfterAccess angefordert Einträge auf jeder Cache-Modifikation vertrieben werden können, auf gelegentliche Cache zugreift, oder auf Anrufe zu Cache.cleanUp(). Abgelaufene Einträge können von Cache.size() gezählt werden, sind aber niemals für Lese- oder Schreibvorgänge sichtbar.

Und es gibt weitere Einzelheiten über die wiki:

Caches mit CacheBuilder gebaut keine Bereinigung durchführen und Werte zu vertreiben „automatisch“ oder sofort nach einem Wert abläuft, oder etwas dergleichen. Stattdessen führt es bei Schreibvorgängen oder bei gelegentlichen Lesevorgängen, wenn Schreibvorgänge selten sind, kleine Wartungsaufgaben aus. Der Grund dafür ist wie folgt: Wenn wir die Cache Wartung kontinuierlich durchführen möchten, müssten wir einen Thread erstellen, und seine Operationen würden mit Benutzeroperationen für gemeinsame Sperren konkurrieren. Darüber hinaus beschränken einige Umgebungen die Erstellung von Threads , die CacheBuilder in dieser Umgebung unbrauchbar machen würde.

Stattdessen legen wir die Wahl in Ihre Hände. Wenn Ihr Cache High-Throughput ist, müssen Sie sich nicht darum kümmern, die Cache Wartung durchzuführen, um abgelaufene Einträge und ähnliches zu bereinigen. Wenn Ihr Cache nur selten schreibt und Sie nicht wollen, Cache zu blockieren liest, möchten Sie möglicherweise Ihre eigenen Wartungs-Thread erstellen, die Cache.cleanUp() in regelmäßigen Abständen aufruft.

Wenn Sie eine regelmäßige Cache-Wartung für einen Cache planen möchten, der nur selten schreibt, planen Sie einfach die Wartung mit ScheduledExecutorService.

+0

Ja, danke. – Mark1234

+0

nur aus dem Dokument kopieren, nicht beeindruckt –

+17

@SimonGuo Ich schrieb viel von der Doc. –