问题描述
我将 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)