2012-12-08 83 views
0

存在無法緩存會影響系統負載的問題。緩存資源不存在的事實

由於存在一個錯誤,我的代碼正在調用一個服務時參數不正確,並且服務當然返回了404,null,空的。基本上沒有任何東西可以滿足要求。沒有發現任何事實被返回到正在緩存響應的過程。我的緩存系統不允許我們將值緩存爲空,因此我們基本上無法緩存響應或者沒有響應,因此每次發生此情況時都必須進行實時調用。由於它發生了很多錯誤。

我當然修復了這個錯誤,但我的問題是,是否存在和/或應該緩存一些資源無法找到的事實。如果我們能夠有這樣一個安全網,那麼這個錯誤就不會那麼嚴重。

是否應該有辦法緩存事實沒有找到或沒有找到?爲什麼或者爲什麼不?

我正在使用帶有spymemcached客戶端的memcache服務器,我的代碼是用Java編寫的,但我的問題應該是不可知的。也許其他的實現可能會提供一個cacheKey exists方法或類似的東西。我研究過這個,並沒有在Java世界找到任何我認爲適合我的情況的東西。即使有,我可能無法切換到它,因爲公司的標準。

+0

你的問題涉及到'memcache',而不是Java,正如你指出。那麼爲什麼研究「在Java世界」? – Madbreaks

+0

你抓到我了。我很好奇非java實現如何處理這種情況,但最終我正在研究java解決方案,因爲這是我將使用的。 – gaoagong

回答

1

當你需要知道一個值是否存在,並且null是一個有效值時,我通常會使用「holder」或「singleton」類。例如:

public final class Singleton<T> { 
    private final T value; 
    public Singleton(T value) { 
    this.value = value; 
    } 
    private final T get() { 
    return value; 
    } 
} 

因此,現在的:

// if this returns null, does it mean the document doesn't exist 
// or there's nothing in the cache? 
public Document getCached(String name); 

您可以使用:

// if this returns null, there's nothing in the cache 
// if non-null, the singleton wrapper may contain a null value, 
// indicating the document doesn't exist 
public Singleton<Document> getCached(String name); 
+0

有趣的想法。這肯定會起作用,我不認爲這會是一個巨大的表現。如果有一些內置的功能會很好,但這肯定是缺乏這種功能的一個方法。 – gaoagong

1

爲什麼不直接定義一個常量值代表 null?然後緩存,並在讀取時進行解釋。

+0

這實際上是我考慮過的一個選項。唯一的問題是我使用的實現返回一個Object實例,需要將其轉換爲我使用的對象。如果我有某種默認值,那麼我必須檢查每次從memcache中取出一個對象以查看它是否是該默認對象。這可能會奏效,但對於很少發生的情況來說,這可能會是一種表現。也許這是我看到它的一種表現。如果我沒有找到更好的選擇,我會將此答案標記爲已接受的答案。 – gaoagong