如何在google Cache CacheLoader中传递多个参数?

问题描述 投票:0回答:2

我想使用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
  }
java-8 guava caffeine-cache
2个回答
2
投票

在这些类型的情况下,您有多种选择。

如果所有参数都是映射的一部分,那么您可以使用复合键。保存所有参数并正确实现

equals
hashCode
的数据类是缓存键。

有时这些参数与键无关,但参数是生命周期范围的一部分,例如http 请求,例如用户的访问令牌。在这些情况下,您可能会使用像 Guice 这样的依赖注入器,它知道这个生命周期。在这些情况下,您可以注入

Provider<T>
(或等效项)并在运行时解析参数。

最后一个选项是不使用

CacheLoader
而是使用
cache.get(key, loader)
。加载器,a
Callable
,是一个“捕获 lambda”,这意味着它可以访问周围范围内的参数。这种方法的缺点是您不能使用
refreshAfterWrite
,因为这需要
CacheLoader


0
投票

您可以检查缓存中是否存在值,如果不存在则调用您的自定义加载方法吗?像这样的东西(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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.