2014-03-13 34 views
0

默認ASP.NET在內存緩存中使用,因此它看起來像在內部使用字典<>使用鍵值對。但是外部緩存解決方案(如Azure緩存或其他緩存解決方案)會序列化與內存解決方案中不同的數據。在下面的例子中,我拿着鑰匙列表對象,我更新它。緩存如何檢測複雜的對象更改並有效地更新緩存數據

var users = new List<User>(); 
HttpContext.Cache.Insert("key", users); 
users.Add(new User());//cached list will update itself with this insertion ? 
var cachedUsers = (List<User>) HttpContext.Cache["key"];// now i got users list object reference or copied users list without inserted user ? 

正如我評論了行,如果這種情況下使用默認的ASP.NET的內存緩存解決方案,所以很顯然,緩存保存用戶列表參考,但答案是不斷變化的,如果我使用像Azure的緩存解決方案,外部緩存解決方案。如果使用外部解決方案來序列化對象而不是緩存對象引用,下面的問題的答案是什麼?

緩存列表將使用該插入更新自己?

如果我從緩存中取回數據,它將是用戶列表對象引用或複製的用戶列表而不插入用戶?

回答

3

在存儲內存數據的緩存中,您的用戶列表將被更新。顯然,在序列化數據的緩存存儲中,您的用戶列表將包含沒有新添加用戶的列表。

以任何方式依賴緩存值在將緩存值插入緩存後得到更新是不好的做法。如果您想稍後轉移到其他類型的緩存呢?當您緩存的數據發生變化時,您將緩存無效,然後重新填充它。不要依賴實施。

+0

如果我有場景添加或刪除列表對象在某些情況下,所以我必須更新緩存中的整個列表?因此,僅僅爲了一次添加或刪除操作而更新非常大的列表對性能影響不大? – Freshblood

+0

如果你有一個需要經常更新的大型列表,它可能不是一個很好的緩存候選項。 –

+0

有一個想法有效地處理這種情況? – Freshblood