使用缓存作为数据库前面的一层

Using a cache as a layer in front of a database

我正在处理一些本质上是异步的后端服务。也就是说,我们有多个作业 运行 是异步的,结果被写入一些记录。

这条记录基本上是一个 class 包装 HashMap 个结果(键是 job_id)。

问题是,我不想计算或提前知道有多少工作要 运行(如果我知道,我可以 cache.invalidate() 当所有工作都有时的关键已经完成)

相反,我想要以下方案:

  1. 设置新记录的到期时间(即expireAfterWrite
  2. 到期时,写入(实际上upsert)记录数据库
  3. 如果发生缓存未命中,将调用load()从数据库中获取记录(如果找不到,则创建一个新记录)

问题: 我尝试使用 Caffeine 缓存,但问题是记录没有在它们应该的确切时间过期。然后我阅读了这个 SO answer Guava's Cache,我想类似的机制也适用于 Caffeine。

所以问题是记录可以在缓存中 "wait" 相当长一段时间,即使它已经完成。有没有办法克服这个问题?也就是说,有没有办法"encourage" 缓存使过期的项目失效?

这让我质疑我的解决方案。您认为我的解决方案是一个好的做法吗?

P.S。如有必要,我愿意切换到其他缓存解决方案。

你可以用write-behind看看Ehcache。这肯定需要更多的设置工作,但它运行良好