首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >番石榴CacheBuilder和存储密钥与查找密钥不同

番石榴CacheBuilder和存储密钥与查找密钥不同
EN

Stack Overflow用户
提问于 2016-07-28 18:33:15
回答 1查看 1K关注 0票数 0

嘿,使用google的CacheBuilder / CacheLoader:

代码语言:javascript
复制
CacheBuilder.newBuilder().maximumSize(MAX_SIZE).expireAfterAccess()
                                  .build(new CacheLoader<String, Object>() {
                                      @Override
                                      public Object load(String key) throws Exception {
                                          return Query(key);
                                      }
                                  });

挺直接的。问题是,在查询中使用的关键是在没有缓存的情况下加载,而且实际上可能非常大。我希望将键的哈希实际存储在缓存中,所以当缓存中的查找实际完成时,它使用键的散列,但是当加载完成时,键实际上是完整的查询。

基本上,我希望我的程序通过发送查询来获取函数来使用缓存,但是就在键查找或缓存存储之前,我想知道是否有一个钩子函数,我可以重写这个函数来散列最终缓存存储和查找的键?

提前感谢

更新:

所以我想出了一个使用get的可调用版本的解决方案。如果我将缓存包装在自己的容器中:

代码语言:javascript
复制
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>接口,但是我的用例稍微简单一些,我可以不使用上面的方法。

EN

回答 1

Stack Overflow用户

发布于 2016-07-28 20:01:17

我不相信Guava Cache实现支持这样的东西,但是您可以创建一个装饰器来完成put和get在存储之前的转换。

像这样的东西有用吗?

代码语言:javascript
复制
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);
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38644216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档