Java 如何使用带有byte[]键的guava缓存?
我创建了番石榴缓存:Java 如何使用带有byte[]键的guava缓存?,java,caching,guava,Java,Caching,Guava,我创建了番石榴缓存: Cache<byte[], byte[]> = CacheBuilder.newBuilder() .maximumSize(1_000_000) .expireAfterAccess(20, TimeUnit.MINUTES) .build();use Cache=CacheBuilder.newBuilder() .最大尺寸(1_000_000) .expireAfterAccess
Cache<byte[], byte[]> = CacheBuilder.newBuilder()
.maximumSize(1_000_000)
.expireAfterAccess(20, TimeUnit.MINUTES)
.build();use
Cache=CacheBuilder.newBuilder()
.最大尺寸(1_000_000)
.expireAfterAccess(20,时间单位:分钟)
.build();使用
但是当我调用get()时,它找不到键。当我需要使用array.equals()时,实现似乎使用equals()来查找键
是否需要设置缓存以使其以这种方式工作?在内部,它似乎具有灵活性,因为比较使用的是等价性而不是直接的equals(),但是CacheBuilderAPI似乎没有设置等价对象的方法
任何帮助都将不胜感激。如果自然相等是您唯一的解决方案(如在
HashMap
中),只需将您的实例包装在一个执行此任务的对象中即可!JVM可以很好地处理非常短的活动对象,所以不要为缓存查询而创建一些小对象
正如@LouisWasserman提到的,您可以使用。你应该注意不要修改由缓存键支持的数组。我有点好奇为什么你要用字节数组作为另一个字节数组的键…简短回答:不,你必须用
equals
和hashCode
的正确实现将字节[]
包装到另一个对象中。(如果我没记错的话,ByteBuffer
将在这里工作,并内置到Java中。)@LouisWasserman为缓存添加KeyEquality
风格的评估策略会有什么好处吗?@SotiriosDelimanolis我认为这是经过考虑并被拒绝的。通过跟踪了解详细信息。@LouisWasserman用户认为他们需要的比实际需要的多,谢谢BigInteger
将具有不同前导零数的任何数组合并ByteBuffer
就可以了。你不能建议编辑我的答案吗?这是你应得的;当然,我可以将字节[]包装到一个对象中,但缓存位于基于磁盘的键值存储前面,因此将有数百万个额外对象,而不是少数。看起来这是唯一的选择。(遗憾的是,在如此多的库中,数组是事后才想到的)在您真正遇到性能问题之前,我不会担心数以百万计的对象。