使用缓存作为数据库前面的一层
Using a cache as a layer in front of a database
我正在处理一些本质上是异步的后端服务。也就是说,我们有多个作业 运行 是异步的,结果被写入一些记录。
这条记录基本上是一个 class 包装 HashMap
个结果(键是 job_id
)。
问题是,我不想计算或提前知道有多少工作要 运行(如果我知道,我可以 cache.invalidate()
当所有工作都有时的关键已经完成)
相反,我想要以下方案:
- 设置新记录的到期时间(即
expireAfterWrite
)
- 到期时,写入(实际上
upsert
)记录数据库
- 如果发生缓存未命中,将调用
load()
从数据库中获取记录(如果找不到,则创建一个新记录)
问题:
我尝试使用 Caffeine 缓存,但问题是记录没有在它们应该的确切时间过期。然后我阅读了这个 SO answer Guava's Cache,我想类似的机制也适用于 Caffeine。
所以问题是记录可以在缓存中 "wait" 相当长一段时间,即使它已经完成。有没有办法克服这个问题?也就是说,有没有办法"encourage" 缓存使过期的项目失效?
这让我质疑我的解决方案。您认为我的解决方案是一个好的做法吗?
P.S。如有必要,我愿意切换到其他缓存解决方案。
你可以用write-behind看看Ehcache。这肯定需要更多的设置工作,但它运行良好
我正在处理一些本质上是异步的后端服务。也就是说,我们有多个作业 运行 是异步的,结果被写入一些记录。
这条记录基本上是一个 class 包装 HashMap
个结果(键是 job_id
)。
问题是,我不想计算或提前知道有多少工作要 运行(如果我知道,我可以 cache.invalidate()
当所有工作都有时的关键已经完成)
相反,我想要以下方案:
- 设置新记录的到期时间(即
expireAfterWrite
) - 到期时,写入(实际上
upsert
)记录数据库 - 如果发生缓存未命中,将调用
load()
从数据库中获取记录(如果找不到,则创建一个新记录)
问题: 我尝试使用 Caffeine 缓存,但问题是记录没有在它们应该的确切时间过期。然后我阅读了这个 SO answer Guava's Cache,我想类似的机制也适用于 Caffeine。
所以问题是记录可以在缓存中 "wait" 相当长一段时间,即使它已经完成。有没有办法克服这个问题?也就是说,有没有办法"encourage" 缓存使过期的项目失效?
这让我质疑我的解决方案。您认为我的解决方案是一个好的做法吗?
P.S。如有必要,我愿意切换到其他缓存解决方案。
你可以用write-behind看看Ehcache。这肯定需要更多的设置工作,但它运行良好