我想使用google Cache来缓存我的数据,所以我写了这样的代码。我发现它只能传递一个调用key的参数,但是在我的方法中,我有另一个参数,如何修复我的代码?
private LoadingCacheS<tring, List<Map<String, Long>> getCache(String key,Map<String,String> para1,
String para2){
retrun CacheBuilder.newBuilder()
.refreshAfterWrite(20, TimeUnit.MINUTES)
.expireAfterWrite(30, TimeUnit.MINUTES)
.maximumSize(1)
.build(new CacheLoader<String, List<Map<String, Long>>>() {
@Override
public List<Map<String, Long>> load(String key) throws Exception {
return queryData(key); //can not get the other para
}
@Override
public ListenableFuture<List<Map<String, Long>>> reload(String key, List<Map<String, Long>> oldValue)
throws Exception {
ListenableFutureTask<List<Map<String, Long>>> task = ListenableFutureTask
.create(() -> queryData(key));
executorService.execute(task);
return task;
}
在我的queryData方法中,我有三个参数,如何更改我的代码?
private List<Map<String, Long>> queryData(String key,Map<String,String> para1,
String para2){
//query data and return data
}
在这些类型的情况下,您有多种选择。
如果所有参数都是映射的一部分,那么您可以使用复合键。保存所有参数并正确实现
equals
和 hashCode
的数据类是缓存键。
有时这些参数与键无关,但参数是生命周期范围的一部分,例如http 请求,例如用户的访问令牌。在这些情况下,您可能会使用像 Guice 这样的依赖注入器,它知道这个生命周期。在这些情况下,您可以注入
Provider<T>
(或等效项)并在运行时解析参数。
最后一个选项是不使用
CacheLoader
而是使用 cache.get(key, loader)
。加载器,a Callable
,是一个“捕获 lambda”,这意味着它可以访问周围范围内的参数。这种方法的缺点是您不能使用 refreshAfterWrite
,因为这需要 CacheLoader
。
您可以检查缓存中是否存在值,如果不存在则调用您的自定义加载方法吗?像这样的东西(Kotlin)
fun getDataFromCache(val key: Key, para1: Map<String,String>, para2: String) {
val fromCache = cache.getIfPresent(key)
if (fromCache != null) {
return fromCache
} else {
val loaded = queryData(key, para1, para2)
cache.put(key, loaded)
return loaded
}
}