我有一个 Java 服务,它通过数据库查找将 String 键转换为 Long id。我将它包装在 Guava Cache 中以减少数据库查询。从键到 id 的映射一旦设置就不会改变,所以我可以对现有键使用较长的过期时间。但是有一个时间问题(不是在 Guava 中,而是在我的应用程序中),有人可能会在密钥进入数据库之前查找密钥的 id。我不想将这个“丢失的”映射缓存很长时间。不过,我确实想缓存它,以避免对相同的缺失键进行大量查询。
我读了这个问题:Handle null value ...,然后我拼凑了一个带有 2 个缓存的解决方案。我有一个“丢失的键”缓存,我让它更快地过期并且它没有自动加载功能。我首先检查这个缓存,如果我在那里找到什么我知道它是一个丢失的键。否则,我尝试“真实”缓存,捕获 ExecutionException 以指示“丢失”,然后手动填充“丢失键”缓存。感觉挺别扭的,尤其是我在没有映射的情况下在load方法中抛出异常的部分。所以我想知道是否没有更优雅的方法来处理这类问题。