2016-07-28 59 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); 
    } 

}