Guava中key和value过期后如何刷新缓存中的key和value(Spring)

How to refresh the key and value in cache after they are expired in Guava (Spring)

所以,我正在研究 Java (Spring) 中的缓存方法。 Guava 看起来可以解决这个问题。

这是用例 -

我从远程服务查询一些数据。我的应用程序的配置字段种类。我的应用程序的每个入站请求都将使用此字段。而且每次都调用远程服务会很昂贵,因为它是一种定期变化的常量。

因此,在第一个入站请求进入我的应用程序时,当我调用远程服务时,我会缓存该值。我将此缓存的到期时间设置为 30 分钟。 30 分钟后,当缓存过期并且有检索密钥的请求时,我想要一个回调或其他操作来调用远程服务并设置缓存和 return 该密钥的值。

如何在 Guava 缓存中实现?

这里我举例说明如何使用guava缓存。如果你想处理 removal listener 那么需要调用 cleanUp。这里我 运行 一个线程,每 30 分钟调用一次清理。

import com.google.common.cache.*;
import org.springframework.stereotype.Component;


import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

@Component
public class Cache {

public static LoadingCache<String, String> REQUIRED_CACHE;

public Cache(){
    RemovalListener<String,String> REMOVAL_LISTENER = new RemovalListener<String, String>() {
        @Override
        public void onRemoval(RemovalNotification<String, String> notification) {
            if(notification.getCause() == RemovalCause.EXPIRED){
                //do as per your requirement
            }
        }
    };

    CacheLoader<String,String> LOADER = new CacheLoader<String, String>() {
        @Override
        public String load(String key) throws Exception {
            return null; // return as per your requirement. if key value is not found
        }
    };

    REQUIRED_CACHE = CacheBuilder.newBuilder().maximumSize(100000000)
            .expireAfterWrite(30, TimeUnit.MINUTES)
            .removalListener(REMOVAL_LISTENER)
            .build(LOADER);

    Executors.newSingleThreadExecutor().submit(()->{
        while (true) {
            REQUIRED_CACHE.cleanUp(); // need to call clean up for removal listener
            TimeUnit.MINUTES.sleep(30L);
        }
    });
}
}

输入和获取数据:

Cache.REQUIRED_CACHE.get("key");
Cache.REQUIRED_CACHE.put("key","value");