2010-10-29 54 views
2

我有一個應用程序實現了一個命令對象模式來從服務器獲取數據。現在我想實現一個客戶端緩存,我需要一些關於如何處理緩存的指針 eviction 無效。命令對象緩存失效

問題

爲了得到一個對象我通過GetObject的(ID)命令和receieve一個GetObjectResponse的結果該ID。我有一個緩存可以很好地緩存GetObject(id)的響應。

但是,當我看到像DeleteObject(id)或UpdateObject(id)這樣的命令時,緩存的GetObject(id)響應需要失效。

我應該說,現實並不一定這麼簡單,就像使用一個id參數一樣。某些響應對象依賴於命令對象中的多個參數。另外,傳遞一個命令對象可能使多個響應對象失效。

有關如何完成此任何想法?提前致謝!

+3

引用Haacked:計算機科學只有兩個難題。命名事物,緩存失效和偏離錯誤。 – 2010-10-29 17:44:48

+0

由於您已經在使用Command模式,請查看責任鏈模式。 – 2010-10-29 20:12:38

回答

0

我最後寫一CacheInvalidationGenerator類用這種方法:

public ArrayList<Action> getInvalidForAction(Action action) { 
    ArrayList<Action> result = new ArrayList<Action>(); 
    if (action.getClass()==UpdateObject.class) { 
    UpdateObject a = (UpdateObject) action; 
    result.add(new GetObject(a.getObjectId())); 
    } 
    return result; 
} 

的方法簡單地返回到從緩存中無效的操作對象。當然,這些也可能會產生失效,所以這個方法應該被遞歸地調用。

0

首先,問題被稱爲緩存無效,而不是驅逐。 (我看你使用這兩個術語。)高速緩存逐出意味着當高速緩存滿時從高速緩存中移除元素。這是一個完全不同的話題。其次,我看不到命令​​模式和緩存之間的連接。無論如何,讓我們專注於緩存。

當元素無效時,您必須在緩存中找到它。這與檢索元素的方式相同:通過使用緩存密鑰查找值。這樣的關鍵可以是你提到的id,或者其他一些獨特的值。這個id或元組的外觀取決於你的域(你使用命令模式的方式)。

關於你的最後一個問題,必須有一條規則,告訴你當某個其他元素失效時哪些元素將失效。這取決於命令模式應用程序背後的邏輯。我無法從你的描述中看出這樣的規則究竟是什麼樣子。

+0

感謝您澄清我的術語混淆。我想我正在尋找如何構建這些失效規則的提示。 – dagge 2010-10-29 18:13:11

0

據我所知,你的客戶端需要一個服務器狀態的本地緩存。 當服務器狀態發生變化時,您的客戶端需要得到通知和更新。 我的建議是從極端的情況開始,使整個緩存失效,然後在不發送整個服務器狀態的情況下更新更小而更精細的緩存。做更好的更新的想法是「標記」服務器狀態的每個變化,以便客戶端可以發送他的最後一個標記,然後服務器可以根據他的當前標記來計算更新客戶端的最佳方式(整體更新或者只是字段)。