2016-07-28 83 views
0

嘿一切都讓使用谷歌的CacheBuilder /的CacheLoader:番石榴CacheBuilder和存儲密鑰不同於查找鍵

CacheBuilder.newBuilder().maximumSize(MAX_SIZE).expireAfterAccess() 
            .build(new CacheLoader<String, Object>() { 
             @Override 
             public Object load(String key) throws Exception { 
              return Query(key); 
             } 
            }); 

漂亮的直線前進。事情是關鍵用於查詢加載時不在緩存中,實際上可能很大。我想實際上將密鑰的散列存儲在緩存中,因此當緩存中的查找實際完成時,它將使用密鑰的散列,但是當加載完成時,密鑰實際上是完整的查詢。

基本上我想我的程序使用緩存通過發送查詢獲取函數,但只是在鍵查找或緩存存儲之前我想知道是否有一個鉤子函數我可以重寫以散列最終緩存存儲和查找的關鍵?

在此先感謝

更新:

所以我想通了使用get的可調用版本的解決方案。如果我包緩存在我自己的容器:

class WrappedCache { 
    private Cache<String, Object> mInnerCache; 

    public Object get(String key) { 
     String hashedKey = Hash(key); // get hashed key 

     return mInnerCache.get(hashedKey, new Callable<Object>() { 
      return Query(key); 
     } 
    } 
} 

這樣的內部緩存只有哈希值交易,但可調用獲取原始查詢是否需要它來執行它的行動。

如果我需要一個更復雜的解決方案,我可以讓WrappedCache實現Cache<K,V>接口,但我的使用情況稍微簡單一些,我可以避開上面的問題。

+1

不,番石榴對此沒有支持。 –

+0

僅供參考:Guava有一個'AbstractCache'和一個'AbstractLoadingCache',如果您選擇這樣做,應該有助於實現您自己的'Cache' /'LoadingCache'。 – mfulton26

回答

0

我不相信Guava Cache實現支持這樣的事情,但是您可以創建一個裝飾器來執行put上的翻譯並在存儲之前獲取。

會這樣的工作?

public class CacheDecorator<K1, K2, V> { 

    private final Function<K1, K2> keyConversion; 
    private final LoadingCache<K2, V> cache; 

    public CacheDecorator(Function<K1, K2> keyConversion, LoadingCache<K2, V> cache) { 
     this.keyConversion = keyConversion; 
     this.cache = cache; 
    } 

    public V get(K1 key) throws ExecutionException { 
     return cache.get(keyConversion.apply(key)); 
    } 

    public void put(K1 key, V value) { 
     cache.put(keyConversion.apply(key), value); 
    } 

}