saket agarwal
saket agarwal

Reputation: 11

How to make spring cache return null when value not found in cache but it asynchronously loads the cache for further requests?

I'm using the CaffeineCache implementation and used refreshAfterWrite along with cacheLoader. This will return the stale value if key is present while it loads the new value in cache but what if I want it to return null when key is not present but also fetch the value asynchronously for subsequent requests.

private CaffeineCache buildCache(String cacheName, Ticker ticker, Long maxSize, Long ttl, TimeUnit ttlUnit,
                                 CacheLoader<Object, Object> cacheLoader){

    Caffeine<Object, Object> cacheBuilder = Caffeine.newBuilder();

    // TTL
    if (ttl != null && ttl > 0 && ttlUnit != null) {
        if (cacheLoader != null) {
            cacheBuilder.refreshAfterWrite(ttl, ttlUnit);
            cacheBuilder.expireAfterWrite(180, TimeUnit.MINUTES);
        } else {
            cacheBuilder.expireAfterWrite(ttl, ttlUnit);
        }
    }

    // Max size
    if (maxSize != null && maxSize > 0){
        cacheBuilder.maximumSize(maxSize);
    }

    // Ticker
    cacheBuilder.ticker(ticker);

    if (cacheLoader != null) {
        return new CaffeineCache(cacheName, cacheBuilder.build(cacheLoader));
    }

    return new CaffeineCache(cacheName, cacheBuilder.build());
}

This is my cache config currently, refreshAfterWrite is much less than expireAfterWrite.

Upvotes: 0

Views: 565

Answers (0)

Related Questions