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

问题描述

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

    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 使用 Foo 中的 id 作为键,而不是从类名等生成它(我肯定知道 id 将是唯一的对于每个 Foo 实例)?

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

解决方法

Cache[F[_],V] trait 具有显式的 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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...