2012-06-19 56 views
2

我們目前有一個應用程序框架,我們可以在業務層(使用.NET緩存)自動緩存實體和實體集合。因此,GetWidget(int id)方法在訪問數據庫之前使用密鑰GetWidget_Id_ {0}檢查緩存,GetWidgetsByStatusId(int statusId)方法使用GetWidgets_Collections_ByStatusId_ {0}檢查緩存。如果對象不在緩存中,則從數據庫中檢索它們並將其添加到緩存中。實體和集合的緩存策略

這種方法對於讀取場景來說顯然很快,而且我們可以快速實現,但需要在對實體執行CRUD操作時清除大量緩存鍵。很明顯,隨着其他方法的增加,這會影響性能和緩存的好處。

我對處理集合緩存的替代方法感興趣。我知道NHibernate緩存集合中的標識符列表,而不是實際的實體。這是其他人嘗試過的方法嗎?有什麼優點和缺點?

特別是我正在尋找優化性能的選項,並且可以通過樣板生成的代碼自動實現(我們有自己的代碼生成工具)。我知道有些人會說緩存需要每次手動完成以滿足特定情況的需求,但我正在尋找能夠讓我們自動完成大部分任務的方法。

+1

意見問題應該在Programmers.StackExchange上:http://programmers.stackexchange.com – CAbbott

+1

@CAbbott我認爲這個問題符合常見問題解答中的問題 - 它涉及到「特定的編程問題」並且是可以回答的。 –

+0

我想說,你不是在問一個「實際的編程問題」,即「我寫了* X *並且它不工作」,而是你正在徵求*意見*以引發討論。 – CAbbott

回答

0

不確定你的問題是真的。

但看看redis,它是一個數據結構緩存,你可以使用它。

根據您的定義,您正在存儲GetWidget_Id_ {0},爲什麼要這麼做?首先您可以擁有自己的緩存,並且可以輕鬆地寫入內存緩存容器。

interface ICache<K,V>{ 
    put(K,V) 
    V get(K) 
    delete(K) 
} 

class CacheContainer<K,V> : ICache<K,V> 
{ 

    ConcurrentHashMap<K,V> _cache = new .... 

    put impl.. 
    get impl.. 
    delete impl.. 

    purge.. 


} 

可以延長這一點,並有LRU,LFU,任何形式在你的子類緩存算法的。

至於存儲集合,與將項目存儲爲列表或集合相同的想法。

看看redis真正理解的內存/緩存集合。一旦你理解了這些概念,看看緩存算法

希望這會有所幫助。