0

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

这是用例 -

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

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

我怎样才能在番石榴缓存中做到这一点?

4

1 回答 1

2

这里我举一个例子如何使用番石榴缓存。如果要处理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");
于 2018-07-27T13:38:41.533 回答