嘿,使用google的CacheBuilder / CacheLoader:
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>接口,但是我的用例稍微简单一些,我可以不使用上面的方法。
发布于 2016-07-28 20:01:17
我不相信Guava Cache实现支持这样的东西,但是您可以创建一个装饰器来完成put和get在存储之前的转换。
像这样的东西有用吗?
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);
}
}https://stackoverflow.com/questions/38644216
复制相似问题