1

我正在使用 CaffeineCachememoizeF来缓存将案例类作为输入的操作的结果,如下所示:

    case class Foo(id: UUID, bar: String)

    implicit val myCache: CaffeineCache[Foo] =
      buildCache(cacheConfig.size) //builds the CaffeineCache

    def cachedOperation(foo: Foo): Future[Foo] =
      memoizeF(cacheConfig.duration) {
        // do something with foo and return it
      }

现在,在某些情况下,我需要从缓存中显式删除特定元素。

我想我可以使用myCache.doRemove(key),但从我在 ScalaCache 文档中看到的内容来看,当使用memoizeF密钥时,将“从类名、封闭方法的名称和所有方法参数的值”生成,而我没有从中进行反向工程key并与之一起使用doRemove是一个好主意。

是否有另一种方法可以从缓存中删除特定元素,如果它是使用 插入的memoizeF?或者,也许我可以以某种方式告诉memoizeF使用idfrom Foo 作为键,而不是从类名等生成它(我确定ids 对于每个 Foo 实例都是唯一的)?

对于这种情况,也许使用memoizeF根本不是一个好主意,我应该回到“手动”插入缓存?任何输入表示赞赏。我查看了官方文档并四处搜索,但没有运气。

4

1 回答 1

2

Cache[F[_], V]特征具有显式caching方法,您可以在其中指定缓存键:https ://github.com/cb372/scalacache/blob/master/modules/core/src/main/scala/scalacache/CacheAlg.scala#L56

所以你可以这样做:

case class Foo(id: UUID, bar: String)

val myCache: CaffeineCache[Foo] = buildCache(cacheConfig.size) //builds the CaffeineCache

def cachedOperation(foo: Foo): Future[Foo] =
   myCache.caching(foo)(cacheConfig.duration) {
        // do something with foo and return it
   }

def removeCache(foo: Foo): Future[Unit] = myCache.remove(foo)
于 2021-03-17T12:42:44.807 回答