2012-08-29 25 views
1

我需要將數據列表存儲在緩存中。使用memcached緩存和檢索數據列表

有時我需要完整列表有時我只需要查詢結果並從列表中返回一個項目。

目前一個項目的邏輯是這樣的:

User result; 
var cachedUsers = _cache.Get<List<User>>(Constants.Cache.UsersKey); 
if(cachedUsers != null) 
{ 
    result = cachedUsers.FirstOrDefault(u => u.UserID == userID); 

    if (result != null) 
     return result; 
} 

result = GetUserFromDb(userID); 

if (cachedUsers != null) 
{ 
    cachedUsers.Add(result); 
    _cache.Store(StoreMode.Set, Constants.Cache.UsersKey, cachedUsers); 
} 

return result; 

我可以直接訪問一個元素從緩存中,而無需加載用戶的完整列表?我還需要邏輯來將用戶添加到緩存中,而不加載完整列表並覆蓋它。

編輯:我有選擇存儲與列表分開的項目,或從頭開始用不同的方法寫入緩存。

實施此邏輯的最佳方法是什麼?

+0

PLZ參考http://stackoverflow.com/questions/6166769/should-i-store-an-array-or-individual-items-in-memcache – sundar

回答

1

您可以執行的最細粒度的操作是檢索特定的密鑰。如果您存儲該項下的項目列表,您會看到列表。要準確獲取一個項目,您需要爲每個項目存儲一個項目。

對此有各種策略,但請注意,原子性處於關鍵級別,因此跨多個鍵執行操作可能會導致競爭條件。個人而言,我會自定義序列化您的列表(而不是依賴於默認的.NET序列化),因爲這將是相當快速的。但是,這取決於在討論更新個人密鑰或請求單個密鑰時「有時」多少次。常用的「存儲它,你會使用它」在這裏適用。

對於自定義序列化,我們使用Protobuf-net並手動存儲所產生的byte[]到緩存中 - 如,緩存採用,並給出了byte[],我們做手工的系列化。

+0

更新單個記錄不會經常進行,但該選項將必須在那裏。請求將會被完成很多。你能給我一些鏈接或自定義序列化如何幫助我的例子。謝謝。 –

1

簡短的回答是沒有。你緩存了整個列表並且緩存是dumb它不知道你緩存了什麼,只是緩存了一塊數據。你必須全力以赴。

但是,我曾經通過單獨使用設置的密鑰模式緩存項目並單獨緩存列表索引來解決此問題。然而,管理起來有些相當繁瑣,然後你有多個對象都有自己的緩存生存時間。