首页 > 解决方案 > 使用缓存作为数据库前面的一层

问题描述

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

该记录基本上是一个包装HashMap结果的类(键是job_id)。

问题是,我不想提前计算或知道要运行多少作业(如果我知道,我可以cache.invalidate()在所有作业都已经完成时打开钥匙)

相反,我想要以下方案:

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

问题: 我尝试使用 Caffeine 缓存,但问题是记录没有在预期的确切时间过期。然后我阅读了这个关于 Guava's Cache 的SO 答案,我想类似的机制也适用于咖啡因。

所以问题是一个记录可以在缓存中“等待”很长一段时间,即使它已经完成了。有没有办法克服这个问题?也就是说,有没有办法“鼓励”缓存使过期项目无效?

这导致我质疑我的解决方案。你会认为我的解决方案是一个好习惯吗?

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

标签: javacachingguavajcachecaffeine

解决方案


您可以通过 write-behind 查看 Ehcache。这肯定是更多的设置工作,但它工作得很好


推荐阅读