Guava缓存不会从缓存中获取值并刷新每个调用

时间:2017-09-08 17:50:39

标签: apache-spark google-guava-cache

我已经在我的spark应用程序中创建了缓存,每6小时刷新一些值。

代码如下所示。

val cachedList: Cache[String, String] = CacheBuilder.newBuilder()
    .maximumSize(10)
    .expireAfterWrite(refreshTimeInSeconds.toLong, TimeUnit.SECONDS)
    .build()

此方法为我获取项目和缓存。

  def prepareUnfilteredAccountList(): Array[String] = {
    logger.info("Refreshing the UNFILTERED Accounts List from API")
    val unfilteredAccounts = apiService.getElementsToCache().get.map(_.accountNumber).toArray
    logger.trace("cached list has been refreshed New List is " +

    unfilteredAccounts
  }

此方法用于将缓存的值放入列表中。

def getUnfilteredList(): Array[String] = {
    unfilteredAccounts.get("cached_list", new Callable[String]() {
      override def call(): String = {
        prepareUnfilteredAccountList().mkString(",")
      }
    }).split(",")
  }

但是,我发现每次调用都会刷新缓存,而不是在指定的时间段后刷新。

1 个答案:

答案 0 :(得分:0)

首先,如果要在Cache中存储列表或数组,则无需将其转换为字符串,然后将其拆分为数组。

其次,maximumSize()配置缓存中有多少条目 - 通过它的外观,您的缓存只有一个条目(您的列表),因此指定最大大小是没有意义的。

第三,如果您只是尝试缓存一个值,则可能更喜欢Suppliers.memoizeWithExperiation() API,这比Cache更简单,更便宜。

第四,prepareUnfilteredAccountList() unfilteredAccounts似乎是一个数组,但在getUnfilteredList()中,同一个变量似乎是一个缓存。充其量这对你来说很困惑。出于不同目的使用不同的变量名称。这可能是导致问题的原因。

所有这一切都说调用Cache.get(K, Runnable)应该按预期工作 - 只有当缓存中尚未存在给定密钥并且尚未过期时,它才会调用Runnable。如果这不是你看到的行为,那么你的代码中可能存在其他错误。也许您的refreshTimeInSeconds不是您所期望的,或者您实际上并没有读取您正在缓存的值,或者缓存实际上是按预期工作的,并且您错误地将其行为误认为是错误的。