【问题标题】:Map based cache with expiration and soft values具有过期和软值的基于映射的缓存
【发布时间】:2011-10-14 07:17:57
【问题描述】:

我希望在地图中缓存信息,这样我就不必保留,例如,点击数据库。在 Java 中,我会使用 Google 集合的优秀 MapMaker 并设置过期时间,以保持缓存尽可能新鲜,并使用 softValues 来降低内存使用率。然后我会有一个函数来计算当前未缓存的键的值。

MapMaker().softValues
          .expireAfterWrite(10, TimeUnit.MINUTES)
          .makeComputingMap(Function(...));

在 Scala 中最好的方法是什么?

【问题讨论】:

  • 如果这在 java 中对你很有效,为什么在 Scala 中会有所不同呢?我不知道有任何 scala 特定的库。
  • 嗯,我希望得到一个更惯用的答案。虽然 Google Guava 非常出色,但当 Scala 的集合库编写得如此出色时,我宁愿不必包含依赖项。
  • 仅供参考,MapMaker().softValues 现在是deprecated,请改用CacheBuilder.softValues()

标签: scala collections functional-programming


【解决方案1】:

正如Kim 所说,如果MapMaker 对你很有效,为什么会有不同的做法?

import collection.JavaConverters._
val cache = /* your MapMaker code creating a Java map */.asScala

现在您可以使用 Scala 映射中的方法访问底层 Java 映射。

【讨论】:

  • 当然,但正如我对 Kim 所说,一定有一种更 Scala 风格的方式来做到这一点?
  • @Ben,据我所知,并非开箱即用。
【解决方案2】:

我在 Scala 中创建了一个功能透明的过期映射。添加和删​​除元素会生成一个新地图,该地图还会删除所有过期值。

Expiration Map

【讨论】:

    【解决方案3】:

    我也在 Scala 中继续使用 Guava 缓存解决方案 :)

    首先,正如其中一个 cmets 所述,在较新版本的 Guava Cache 中,MapMaker() 现在已弃用,您应该改用 CacheBuilder

    所以现在,在 Scala 中,它将如下所示:

      lazy val cachedData = CacheBuilder.newBuilder()
        .expireAfterWrite(60, TimeUnit.MINUTES)
        .maximumSize(10)
        .build(
          new CacheLoader[Key, Data] {
            def load(key: Key): Data = {
              veryExpansiveDataCreation(key)
            }
          }
        )
    

    要从中读取,您可以使用以下内容:

      def cachedData(ketToData: Key): Data = {
        try {
          return cachedData.get(ketToData)
        } catch {
          case ee: Exception => throw new YourSpecialException(ee.getMessage);
        }
      }
    

    【讨论】:

      猜你喜欢
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多