2014-03-12 118 views
0

我是新來的Guava緩存並尋求一些建議。選擇Guava Cache的密鑰

我想緩存「函數」 - 類負責一些計算。每個類有3個雙重屬性:開始,最大,增量

創建密鑰以存儲在緩存中的最佳方式是什麼?複雜的對象怎麼樣?

我正在考慮使用哈希,但對於複雜的對象相同的哈希並不意味着同一個對象。所以key->值不會是唯一的。

另外,Cache如何查找密鑰? 我注意到,如果我使用2個對象傳遞等於的密鑰,Cache認爲它是唯一密鑰。它是基於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()解決了這個問題。這是預期的嗎?

+0

你的對象創建真的很貴嗎?如果不是,則根據需要忘記任何緩存並重新創建。 – maaartinus

回答

2

閱讀docs爲weakKeys

警告:當使用這種方法,所得到的高速緩存將使用標識(==)比較以確定密鑰的平等。

所以,是的,你應該停止使用weakKeys,而你也可能會更好過有一個適當的值對象,而不是一起串聯東西放進String

+0

謝謝。答案是RTFM :) – YaRiK

-1

如果參數是String,則用分隔符將所有參數連接到函數。這將唯一地定義結果。如果參數是數字或兩者的組合,則可以將它們編碼爲ByteBuffer並將其hashCode用作保存內存的關鍵字。如果參數數據很大(可能是+32字節),則可以使用摘要算法(如MD5)對密鑰進行編碼,並將結果用作關鍵字。在這種情況下,您需要權衡生成摘要的處理成本,而不是計算緩存結果。