1

我想使用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
  }
4

1 回答 1

2

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

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

有时这些参数与密钥无关,但这些参数是生命周期范围的一部分,例如与用户的访问令牌等 http 请求有关。在这些情况下,您可能正在使用像 Guice 这样的依赖注入器,它知道这个生命周期。在这些情况下,您可以改为注入Provider<T>(或等效)并在运行时解析参数。

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

于 2021-01-17T05:12:59.523 回答