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");
所以,我正在研究 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");