为番石榴缓存选择钥匙



我是Guava Cache的新手,正在寻找一些建议。

我想缓存"函数" - 负责某些计算的类。每个类都有3个双重属性:开始,最大,增量

创建存储在缓存中的钥匙的最佳方法是什么?复杂对象怎么样?

我正在考虑使用hasher,但是对于复杂的对象,同一哈希并不意味着相同的对象。因此键 ->值将不是唯一的。

另外,缓存如何查找密钥?我注意到,如果我将2个对象用于通过等于的键,则缓存将其视为唯一的键。它是否基于key1 == key2工作?

public static void testGuavaCache() {
    Cache<Object, String> CACHE = CacheBuilder.newBuilder().weakKeys().weakValues().build();
    for (int i = 0; i < 2; i++) {
        Joiner joiner = Joiner.on('|');
        String key1 = joiner.join(i, i, i, i, i, i, i);
        for (int j = 0; j < 2; j++) {
            String key = joiner.join(i, i, i, i, i, i, i);
            System.out.println(key1.equals(key));
            System.out.println(key1 == key);
            try {
                String m = CACHE.get(key, new Callable<String>() {
                    @Override
                    public String call() throws Exception {
                        return "test";
                    }
                });
                System.out.println("Size = " + CACHE.size());
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
}

输出是:

true
false
Size = 1
true
false
Size = 2
true
false
Size = 3
true
false
Size = 4

删除弱键()解决了问题。这是预期的吗?

阅读weakKeys的文档:

警告:使用此方法时,结果缓存将使用身份(==)比较来确定密钥的平等。

是的,是的,您应该停止使用weakKeys,并且最好将一个适当的值对象而不是将事物连接到String中。

如果参数为字符串,请将所有参数与定界符与您的函数相连。这将唯一地定义结果。如果参数是数字或两者的组合,则可以将它们编码为字节式式扣子,并将其用作保存内存的关键。如果参数数据很大(也许 32个字节),则可以使用MD5等摘要算法编码键,并将结果用作密钥。在这种情况下,您需要权衡产生摘要而不是计算缓存结果的处理成本。

最新更新