2013-10-14 137 views
1

我的應用程序在做這件事時會生成很多對象。對象是由於數據庫查詢而生成的,它們是我們的ORM解決方案的一部分。使用這些對象的程序通常會逐一請求它們。需要我的asp.net mvc解決方案的緩存解決方案

我想用System.Runtime.Caching,但我不知道怎麼樣,因爲我有具體標準:

每個用戶都可以登錄到不同的數據庫。適用於所有對象。

數據庫可以有幾個不同的公司配置文件。適用於大多數物體。

大多數物體都是多語言的。

某些對象僅在數據庫事務處於活動狀態時被緩存,然後在回滾或提交時轉儲。我想到的第一個解決方案是爲緩存生成一個複雜的字符串鍵(即數據庫+公司+語言+對象主鍵值),但我不確定這是否正確。我也不確定如何實現事務範圍的緩存。

也許我會更好地控制緩存,如果我使用我自己的實現。事情是這樣的:

public class DatabaseCache 
{ 
    private ConcurrentDictionary<string, ClassCache> m_databases = new ConcurrentDictionary<string, ClassCache>(); 

    public void Add(string database, string className, object item, params string[] itemKeys) 
    { 
    } 
} 

public class ClassCache 
{ 
    private ConcurrentDictionary<string, KeyCache> m_cache = new ConcurrentDictionary<string, KeyCache>(); 

    public void Add(string className, object item, params string[] itemKeys) 
    { 
    } 
} 

public class KeyCache 
{ 
    private ConcurrentDictionary<string, object> m_cache = new ConcurrentDictionary<string, object>(); 

    public void Add(object item, params string[] itemKeys) 
    { 
    } 
} 
+0

您使用的是哪個ORM?有些來自您可以使用的多級緩存。 – user1450877

+0

這是我們自己的ORM。我在7年前設計了它。 – Nezreli

+0

那麼你正試圖解決一個非常複雜的問題,你可能知道。如果我處於你的位置,我會看看如何在其他開源ORM中實現緩存,並查看這些方法是否適用於我。 – user1450877

回答

1

我在CMS中使用了非常類似的方法,它工作得很好,(在CMS中,大多數對象被讀取多次並寫入幾次)。

發生更新時,緩存的對象將失效。在我的緩存密鑰字符串中,第一個參數是一個緩存索引,它在發生更新時發生更改。

如果您有很多更新,每筆交易都可以做兩件事。在數據庫中進行更改,然後更新緩存中的對象,以便不必使它們失效。

關於事務範圍的緩存,您可以保留一個包含事務對象所有密鑰的列表。

在事務結束時,您可以循環此列表並從緩存中刪除所有這些項目。

另一種方法是保留事務對象的集合並將集合對象存儲在緩存中。採用這種方法,您只能從緩存中刪除集合對象。

0

鑑於這一切可以改變(數據庫/公司/語言/主鍵)的事情,你的解決方案中使用所有這些事情建立一個獨特的密鑰緩存是合理的。我使用了我支持的應用程序中的一個非常類似的方案,它的工作沒有問題。

+0

我不喜歡爲每個可能的對象請求構建這樣一個字符串的想法,但也許這是必需的。速度項目,如果我記得正確支持他們的緩存解決方案中的標籤。看起來不錯。 – Nezreli