【发布时间】:2019-07-16 21:12:53
【问题描述】:
所以我一直在努力跟上 scala 缓存的速度。我正在浏览这个文档
https://cb372.github.io/scalacache/docs/
private val thisToThatCache =
CaffeineCache(
Caffeine.newBuilder
.maximumSize(4096)
.expireAfterWrite(4, TimeUnit.HOURS)
.build[String, String)
还有这个缓存调用
import scalacache.modes.try_._
import scala.collection.JavaConverters._
thisToThatCache.caching(thisStr)(ttl = 4.hours)(
fetchThatForGivenThis(thisStr)
)
请注意,我已经定义了两次 TTL,一次在缓存调用中使用 4.hours,另一次基于 4 TimeUnit.Hours
这有点奇怪,所以我开始研究 CaffeineCache 的实现
我看过这个
并且我意识到,无论我将 expire After Write 值放在什么位置,如果缓存 ttl 值已过期(至少应该如此),getter 都会认为工件已过期。
AFAIK 底层缓存定义了驱逐。
所以我的问题是
- scala 缓存的设计决策是什么,有两个不同的 TTL 定义。 IE。驱逐和到期的概念是不相关的,并且是分开定义的?
为了解释我的意思,这里举一个 doPut https://github.com/cb372/scalacache/blob/433d07ddb1249d7e6ec13fe7584a3d785be8d44d/modules/caffeine/src/main/scala/scalacache/caffeine/CaffeineCache.scala#L42 的具体示例,创建一个 Entry 对象并将其放入。该条目定义 isExpired https://github.com/cb372/scalacache/blob/dd7f9988b3b1cab20ba2a9649a51a36210065607/modules/core/shared/src/main/scala/scalacache/Entry.scala#L13,如果 expiresAt 为 None,则计算结果为 false。最后, doGet : https://github.com/cb372/scalacache/blob/433d07ddb1249d7e6ec13fe7584a3d785be8d44d/modules/caffeine/src/main/scala/scalacache/caffeine/CaffeineCache.scala#L29 方法检查它是否过期(如果之前的键的 doPut 已经 expiredAt 为 None,它评估为 false)并返回 None,因为它被认为过期了。请注意,它没有咨询 expireAfter... 超时。所以如果我通过 None,它应该总是评估为 not found。
- 如果 expireAfterWrite
【问题讨论】: