【问题标题】:Guava cache not taking values from cache and refreshing for every call番石榴缓存不从缓存中获取值并为每次调用刷新
【发布时间】:2017-09-08 17:50:39
【问题描述】:

我在我的 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(",")
  }

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

【问题讨论】:

  • 你试过增加maximumSize和refreshTimeInSeconds吗?
  • 是的。我给出的最大尺寸为 200,时间为 6 小时。还是一样。
  • Srini :解决了吗?出了什么问题?
  • 嗨,拉姆,不,没有解决。看起来我不能这样做。我需要一个需要不时刷新并为此目的使用缓存的小列表。但是,看起来我需要找到另一种选择。

标签: apache-spark google-guava-cache


【解决方案1】:

首先,如果您想在Cache 中存储列表或数组,您可以这样做,无需将其转换为字符串然后将其拆分回数组。

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

第三,如果您只想缓存一个值,您可能更喜欢Suppliers.memoizeWithExperiation() API,它比Cache 更简单且更便宜。

第四,在prepareUnfilteredAccountList() unfilteredAccounts 中似乎是一个数组,但在getUnfilteredList() 中,相同的变量似乎是一个缓存。充其量这会让你感到困惑。为不同的目的使用不同的变量名。这可能是您的问题的原因。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多