我正在寻找在地图中缓存信息,所以我不必保持,例如,击中数据库。在Java中我会使用Google集合的优秀MapMaker并设置一个到期时间,以保持缓存尽可能新鲜,以及softValues,以减少内存使用量。然后我会有一个函数来计算当前未缓存的键的值。
MapMaker().softValues
.expireAfterWrite(10, TimeUnit.MINUTES)
.makeComputingMap(Function(...));
在Scala中执行此操作的最佳方法是什么?
答案 0 :(得分:6)
正如金说的那样,如果MapMaker
适合你,为什么会这样呢?
import collection.JavaConverters._
val cache = /* your MapMaker code creating a Java map */.asScala
现在,您可以使用Scala地图中的方法访问基础Java地图。
答案 1 :(得分:1)
我在Scala中创建了一个功能透明的到期映射。添加和删除元素会生成一个新映射,该映射还会删除所有过期的值。
答案 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);
}
}