簡體   English   中英

Google Guava緩存會自動刪除Optional.absent()的值

[英]Google Guava cache auto remove value of Optional.absent()

是否可以使用Optional.absent()值自動逐出記錄? 在某些應用程序中,Optional.absent()可能不是某些鍵的值。 例如,如果應用程序包含http調用,其中鍵可以是某些字符串,並且值是從http調用返回的響應,則由於網絡問題或身份驗證失敗,http調用可以返回一些無效值(例如null),然后可以使用緩存中的鍵將invalid保存為Optional.absent()。 稍后,如果解決了網絡和身份驗證問題,則key-> invalidValue仍保留在緩存中。 解決此問題的最佳方法是什么?

例如,如果應用程序包含http調用,其中鍵可以是某些字符串,並且值是從http調用返回的響應,則由於網絡問題或身份驗證失敗,http調用可能返回一些無效值(例如null)。

如果可能,我將更改此行為以在請求失敗或響應無效時引發異常-這就是異常的用途。 有關更多信息,請參見有效的Java:項目57

然后可以使用緩存中的密鑰將無效項另存為Optional.absent()。 稍后,如果解決了網絡和身份驗證問題,則key-> invalidValue仍保留在緩存中。 解決此問題的最佳方法是什么?

你有什么需要保存的無效結果在高速緩存中的原因是什么? 如果您不在意這種情況,而只是希望將其從緩存中排除,最簡單的選擇就是不首先緩存它。 在不良結果上拋出異常會很容易。

如果確實需要暫時將無效結果保留在緩存中,則可以在准備好簡單的for循環后將其清除:

ConcurrentMap<K, V> cacheAsMap = cache.asMap();
for (Entry<K, V> e : cacheAsMap .entrySet()) {
  if (!e.getValue().isPresent()) {
    cacheAsMap.remove(e.getKey(), e.getValue());
  }
}

通過使用ConcurrentMap.remove() ,可以避免可能的競爭情況,即在e.getValue().isPresent()但實際上使該條目無效之前更新該條目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM