2016-07-28 4 views
0

異なる保存キーねえすべてのように使用して、Googleの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); 
     } 
    } 
} 

この方法は、内部キャッシュは、ハッシュ値を扱うが、それはそれのアクションを実行するためにそれを必要とする場合に呼び出し可能で、元のクエリを取得します。

もっと複雑な解決策が必要だった場合、WrappedCacheCache<K,V>インターフェイスを実装することができましたが、私の使用例は少しシンプルであり、上記で取り除くことができます。

+1

いいえ、Guavaはこれをサポートしていません。 –

+0

FYI: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); 
    } 

} 
関連する問題