具有到期和软值的基于地图的缓存

时间:2011-07-27 13:54:02

标签: scala collections functional-programming

我正在寻找在地图中缓存信息,所以我不必保持,例如,击中数据库。在Java中我会使用Google集合的优秀MapMaker并设置一个到期时间,以保持缓存尽可能新鲜,以及softValues,以减少内存使用量。然后我会有一个函数来计算当前未缓存的键的值。

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

在Scala中执行此操作的最佳方法是什么?

3 个答案:

答案 0 :(得分:6)

正如金说的那样,如果MapMaker适合你,为什么会这样呢?

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

现在,您可以使用Scala地图中的方法访问基础Java地图。

答案 1 :(得分:1)

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

Expiration Map

答案 2 :(得分:0)

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

首先,正如其中一条评论中所述,在较新版本的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);
    }
  }