我有一个 Java 服务,它通过数据库查找将 String 键转换为 Long id。我将它包装在 Guava 缓存中以减少数据库查询。从键到 id 的映射一旦设置就不会改变,因此我可以对现有键使用较长的过期时间。但是存在时间问题(不是在 Guava 中,而是在我的应用程序中),有人可能会在 key 进入数据库之前查找 key 的 ID。我不想长时间缓存这个“丢失”的映射。不过,我确实想缓存它,以避免对相同丢失的键的大量查询。
我读了这个问题:Handle null value ... ,然后我从那里拼凑了一个带有 2 个缓存的解决方案。我有一个“丢失的 key ”缓存,我让它过期得更快而且它没有自动加载功能。我首先检查这个缓存,如果我在那里找到什么东西,我就知道它丢失了 key 。否则,我会尝试“真正的”缓存,捕获一个 ExecutionException 以指示“丢失”,然后手动填充“丢失的键”缓存。感觉挺别扭的,尤其是在没有映射的情况下我在load方法中抛出异常的部分。所以我想知道是否有更优雅的方式来处理这类问题。
最佳答案
您可能会尝试基于 refresh
的方法,您可以在其中实现 CacheLoader.reload(key, oldValue)
来主动刷新“丢失”的映射,而您只需保留 oldValue
如果 oldValue
不是“缺失”。
关于java - 如何让丢失的条目在 Guava 中更快地过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16070641/