簡體   English   中英

Guava CacheLoader 具有多個鍵,每個鍵都有自己的 refreshAfterWrite

[英]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");

我想為allowedTransactionsdeniedTransactions設置不同refreshAfterWrite時間,並使用相同的緩存來獲取它們。 這可以使用單個 CacheLoader 嗎? 我看到可以將一個key傳遞給 reload 方法,但不確定如何使用它,並且每個鍵的refreshAfterWrite不同。

allowedTransactions = cache.get("allowedTransactions");
deniedTransactions = cache.get("deniedTransactions");

我希望使用鍵allowedTransactions的緩存在 1 小時后重新加載,並使用鍵deniedTransactions在 5 分鍾后重新加載。

我不想擁有不同的緩存,因為allowedTransactionsdeniedTransactions都是從單個 API 調用中接收的,並且希望它們位於單個緩存中。 我覺得這可以通過使用不同的key來實現,但不確定如何讓每個 key 過期,最后一次刷新的時間不會存儲在任何地方。

Guava 不支持此功能。 (我不相信它甚至得到 Caffeine 的支持,它是 Guava 緩存的更高級替代品。)

暫無
暫無

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

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