0

我在我的应用程序中存储引用,例如(键)数字=>(值)名称,通常是短时间(适合保存在内存中),但有时需要更长的时间,这需要我将它持久化到数据库(以在应用程序中存活)重启和内存限制)。之前我们总是坚持到 DB,但现在我想使用 LoadingCache 作为性能增强,因为引用通常是短暂的(不需要坚持)。

在我的应用程序中,我存储引用,例如 key 123 => value "Paul"。我使用过期设置为 45 秒的 LoadingCache,原因是如果 45 秒内没有使用值,我想将它持久保存到数据库(使用 RemovalListener),以便一天后从缓存中请求密钥 123 应该返回“ Paul" 使用.load()来自 DB(因为它不在缓存中)。

我的问题涉及不能保证立即进行维护,并且我不明白何时onRemoval()实际调用以及如何可靠地解决我的问题。

示例流程: 1. 收到输入,说键 123 对应于.put()我的 LoadingCache 2.get()的值“Paul”.invalidate()

LoadingCache 有一个 RemovalListener,它将onRemoval()过期的条目(检查.wasEvicted()以避免显式无效的记录)保存到数据库表。

我的问题是缓存的清理是如何发生的。示例:我添加了一个应在 45 秒后过期的值。如果我在 50 秒后尝试使用.get()它,它不会因为它已过期而归还给我,但据我从测试中了解到的,不能保证在我返回onRemoval()之前使用尚未删除值?.get()这意味着我没有将它持久化到数据库,因此我的 load() 方法也无法找到该值(直到稍后onRemoval()实际发生)。所以,当我需要它时,我已经失去了我的价值,这是不可接受的。

我是否试图将 LoadingCache 用于它不打算用于的东西,或者有什么方法可以使它适合我的需要?或者也许有替代建议/解决方案?

提前非常感谢!

4

0 回答 0