Scalacache 从使用 memoizeF 设置的缓存中删除

Scalacache delete from cache set up with memoizeF

我将 CaffeineCache 与 memoizeF 一起使用来缓存将案例 class 作为输入的操作结果,如下所示:

    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 时,密钥将从 class 生成 "名称,封闭方法的名称以及所有方法参数的值,我不认为从中进行后向工程key并将其与doRemove一起使用是好主意。

如果某个元素是使用 memoizeF 插入的,是否还有其他方法可以从缓存中删除该元素?或者,我能否以某种方式告诉 memoizeF 使用 Foo 中的 id 作为键而不是从 class 名称等生成它(我确定 id s 对于每个 Foo 实例都是唯一的)?

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

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)