如何解决如何在 google Cache CacheLoader 中传递多个参数?
我想用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,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,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,String para2){
//query data and return data
}
解决方法
在这些类型的情况下,您有多种选择。
如果所有参数都是映射的一部分,那么您可以使用复合键。保存所有参数并正确实现 equals
和 hashCode
的数据类是缓存键。
有时这些参数与键无关,但参数是生命周期范围的一部分,例如到 http 请求,例如用户的访问令牌。在这些情况下,你可能会使用像 Guice 这样的依赖注入器,它知道这个生命周期。在这些情况下,您可以改为注入 Provider<T>
(或等效的)并在运行时解析参数。
最后一个选项是不使用 CacheLoader
,而是使用 cache.get(key,loader)
。加载器 Callable
是一个“捕获 lambda”,这意味着它可以访问周围范围内的参数。这种方法的缺点是您不能使用 refreshAfterWrite
,因为它需要一个 CacheLoader
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。