【问题标题】:How to pass more than one parameter in google Cache CacheLoader?如何在 google Cache CacheLoader 中传递多个参数?
【发布时间】:2021-01-17 04:55:52
【问题描述】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 缓存键只有id这样的一个字符串;但结果是通过 id 和其他参数查询。r
    • 在这些情况下,您可以注入 Provider (或等效项)并在运行时解析参数。请举个例子吗?我达不到你的理想。
    • @flower 这些参数是否会影响结果,因为同一id 的两次调用是否会使用不同的参数以检索不同的数据?如果是这样,那么您可能想要使用复合键。
    • @flower 有关示例,请参见 Guice documentation。这就像Supplier&lt;T&gt; 可以在运行时懒惰地查询T,因为该值可能会改变。例如,如果 http 请求将Provider&lt;User&gt; 绑定到John Doe,则对该请求的调用会获取该用户,而下一次调用可能会获取用户Jane DoeCacheLoader获取的是获取参数的策略,而不是直接获取参数。
    • ,key和paramter是一一对应的关系。
    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 2013-11-21
    • 2012-06-12
    • 1970-01-01
    • 2019-03-21
    • 2014-09-09
    • 2015-02-17
    • 2015-06-18
    相关资源
    最近更新 更多