嘿所有人都使用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函数来使用缓存,但是在密钥查找或缓存存储之前我想知道是否有一个钩子函数我可以覆盖以散列最终缓存存储和查找的密钥?
提前致谢
更新
所以我想出了一个使用可调用版本的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);
}
}
}
这样内部缓存只处理哈希值,但是如果需要它来执行它的操作,则callable获取原始查询。
如果我需要一个更复杂的解决方案,我可以让WrappedCache
实现Cache<K,V>
接口,但我的使用情况稍微简单一些,我可以在上面使用。
答案 0 :(得分:0)
我不相信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);
}
}