【问题标题】:How can i use guava cache with a byte[] key?如何使用带有 byte[] 键的番石榴缓存?
【发布时间】:2015-10-06 22:38:00
【问题描述】:

我创建了一个番石榴缓存:

Cache<byte[], byte[]>  = CacheBuilder.newBuilder()
            .maximumSize(1_000_000)
            .expireAfterAccess(20, TimeUnit.MINUTES)
            .build();use

但是当我调用 get() 时它没有找到密钥。该实现似乎使用 equals() 来查找密钥,当我需要它时使用 Arrays.equals()。

有没有办法设置 Cache 使其以这种方式工作?在内部,它似乎具有灵活性,因为比较使用 Equivalence 而不是直接的 equals(),但 CacheBuilder api 似乎没有设置 Equivalence 对象的方法。

任何帮助将不胜感激。

【问题讨论】:

  • 我有点想知道为什么您将字节数组作为另一个字节数组的键...
  • 简短回答:不,您必须将byte[] 包装在另一个对象中,并正确实现equalshashCode。 (如果我没记错的话,ByteBuffer 将在这里工作并且内置于 Java 中。)
  • @LouisWasserman 为缓存添加KeyEquality 样式评估策略有什么好处吗?
  • @SotiriosDelimanolis 我相信这已被考虑并被拒绝。追踪github.com/google/guava/issues/1571了解详情。
  • @LouisWasserman 用户认为他们需要的比实际需要的多得多谢谢!

标签: java caching guava


【解决方案1】:

如果自然平等是您唯一的解决方案(例如在HashMap 中),只需将您的实例包装在一个可以完成这项工作的对象中! JVM 可以很好地处理生命周期很短的对象,所以不要因为只为缓存查询而创建几个小对象而烦恼。

正如@LouisWasserman 所说,您可以使用ByteBuffer。您应该如何注意不要修改由缓存键支持的数组。

【讨论】:

  • BigInteger 将任何具有不同数量前导零的数组混为一谈。不过,ByteBuffer 可以胜任。
  • 你不能建议对我的答案进行编辑以编写吗?你应得的 ;)
  • 当然我可以将 byte[] 包装在一个对象中,但是缓存面向基于磁盘的键值存储,因此会有数百万个额外的对象,而不是少数。似乎这是唯一的选择。 (很遗憾,数组在这么多库中都是事后才想到的)
  • 在您真正遇到性能问题之前,我不会担心数百万个对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多