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>
接口,但我的使用情況稍微簡單一些,我可以避開上面的問題。
不,番石榴對此沒有支持。 –
僅供參考:Guava有一個'AbstractCache'和一個'AbstractLoadingCache',如果您選擇這樣做,應該有助於實現您自己的'Cache' /'LoadingCache'。 – mfulton26