[英]Guava Cache CacheLoader.refreshAfterWrite() and .expireAfterAccess() in combination
[英]Guava CacheLoader with multiple keys each with its own refreshAfterWrite
我目前有一個CacheLoader
public class TransactionsDetailsCache extends CacheLoader<String, Transactions> {
private final Client client;
private final ExecutorService executor = Executors.newFixedThreadPool(1);
public TransactionsDetailsCache(Client client) {
this.client = checkNotNull(client);
}
@Override
public Transactions load(String s) {
return getTransactionsDetails(client);
}
// refreshing here by calling load
@Override
public ListenableFuture<Transactions> reload(String key, Transactions oldValue) {
ListenableFutureTask<Transactions> task = ListenableFutureTask.create(() -> load(key));
executor.execute(task);
return task;
}
@VisibleForTesting
protected Transactions getTransactionsDetails(Client Client) {
Response response = client.getTransactions();
final Set<TransactionDetails> deniedTransactions = response.stream()
.filter(transaction -> "denied".equalsIgnoreCase(transaction.getType()))
.collect(Collectors.toSet());
final Set<TransactionDetails> allowedTransactions = response.stream()
.filter(transaction -> "allowed".equalsIgnoreCase(transaction.getType()))
.collect(Collectors.toSet());
return new Transactions(allowedTransactions, deniedTransactions);
}
}
並使用注入它
@Provides
@Singleton
public LoadingCache<String, Transactions> provideTransactionsDetails(Client client) {
return CacheBuilder.newBuilder()
.refreshAfterWrite(Duration.ofMinutes(60))
.build(new TransactionsDetailsCache(client);
}
我的Transactions
看起來像
@Data
public class Transactions {
Set<TransactionDetails> allowedTransactions;
Set<TransactionDetails> deniedTransactions;
}
我目前正在使用以下內容來獲取Transactions
object。
transactions = cache.get("transactions");
我想為allowedTransactions
和deniedTransactions
設置不同refreshAfterWrite
時間,並使用相同的緩存來獲取它們。 這可以使用單個 CacheLoader 嗎? 我看到可以將一個key
傳遞給 reload 方法,但不確定如何使用它,並且每個鍵的refreshAfterWrite
不同。
allowedTransactions = cache.get("allowedTransactions");
deniedTransactions = cache.get("deniedTransactions");
我希望使用鍵allowedTransactions
的緩存在 1 小時后重新加載,並使用鍵deniedTransactions
在 5 分鍾后重新加載。
我不想擁有不同的緩存,因為allowedTransactions
和deniedTransactions
都是從單個 API 調用中接收的,並且希望它們位於單個緩存中。 我覺得這可以通過使用不同的key
來實現,但不確定如何讓每個 key 過期,最后一次刷新的時間不會存儲在任何地方。
Guava 不支持此功能。 (我不相信它甚至得到 Caffeine 的支持,它是 Guava 緩存的更高級替代品。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.