具有过期和软值的基于映射的缓存

发布于 2024-11-27 02:47:03 字数 455 浏览 0 评论 0原文

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

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

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

I'm looking to cache information in a Map so I don't have to keep, for example, hitting a DB. In Java I'd use Google collection's excellent MapMaker and set an expiry, to keep the cache as fresh as necessary, and softValues, to keep the memory usage down. Then I'd have a function that computes the value for a key that currently isn't cached.

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

What's the best way to do this in Scala?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

戈亓 2024-12-04 02:47:03

正如 Kim 所说,如果 MapMaker 适合您,为什么要采取不同的做法呢?

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

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

As Kim said, why do it differently if MapMaker works well for you?

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

And now you access the underlying Java map with the methods from a Scala map.

眸中客 2024-12-04 02:47:03

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

过期地图

I have created a functionally transparent expiration map in Scala. Adding and removing elements gives a new map, which also removes any expired values.

Expiration Map

音盲 2024-12-04 02:47:03

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

首先,正如其中一条评论中所述,在较新版本的 Guava CacheMapMaker() 现已弃用,您应该使用 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);
    }
  }

I'm keep using Guava cache solution in Scala as well :)

First of all, as noted in one of the comments, in newer versions of Guava Cache, MapMaker() is now deprecated and you should use CacheBuilder instead.

So now, in Scala it will look like the follow:

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

To read from it, you can use something like:

  def cachedData(ketToData: Key): Data = {
    try {
      return cachedData.get(ketToData)
    } catch {
      case ee: Exception => throw new YourSpecialException(ee.getMessage);
    }
  }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文