2011-10-29 26 views
1

我剛安裝Membase的和enyim客戶端.NET和跨提到這個技術集成LINQ的論文是:Membase的服務器,並Enyim - 整合LINQ和/或集合

public static IEnumerable<T> CachedQuery<T> 
     (this IQueryable<T> query, MembaseClient cache, string key) where T : class 
    { 
     object result; 
     if (cache.TryGet(key, out result)) 
     { 
      return (IEnumerable<T>)result; 
     } 
     else 
     { 
      IEnumerable<T> items = query.ToList(); 
      cache.Store(StoreMode.Set, key, items); 
      return items; 
     } 
    } 

它會檢查如果所需數據首先在緩存中,並且如果不緩存則返回。

目前我在我的應用程序中使用了Dictionary<'String, List'>,並且想用membase/memcached類型的方法替換它。

將項目添加到列表<'T'>或在緩存列表上使用Linq運算符的類似模式怎麼樣?在我看來,將單個密鑰下的整個列表「<'T'>存儲在單個密鑰下並且必須檢索它,添加到它,然後在每次要添加元件。或者這是一種可接受的做法?

public bool Add(T item) 
    { 
     object list; 
     if (cache.TryGet(this.Key, out list)) 
     { 
      var _list = list as List<T>; 
      _list.Add(item); 
      return cache.Store(StoreMode.Set, this.Key, _list); 
     } 
     else 
     { 
      var _list = new List<T>(new T[] { item }); 
      return cache.Store(StoreMode.Set, this.Key, _list); 
     } 
    } 

如何集合通常在這樣的情況下緩存處理?通常是使用散列算法,還是使用某種鍵前綴系統來在緩存的鍵值存儲中標識類型T的「列表」?

回答

1

這取決於幾個因素: 這應該是可擴展的嗎?這個列表是否是特定於用戶的,您可以確定「添加」不會同時被同一列表調用兩次嗎? - 種族條件是一種風險。

我沒有實現這樣的事情,我在membase中存儲了一個通用列表,但它是用戶特定的,所以我可以很肯定地確定沒有競爭條件。

您還應該考慮序列化列表的體積,這可能很大。我的情況是名單很小。

不知道它是否有幫助,但我實現了一個非常基本的迭代列表,通過membase隨機訪問(通過雙重間接)。隨機訪問通過組合鍵(由多個字段組成)完成。

您需要:

  1. 有保存列表長度的密鑰。
  2. 有能力構建組合鍵(例如對象中的一個或多個字段)。
  3. 有你想保存的值(例如另一個字段)。

例如:

list_length = 3

prefix1_0-> prefix2_ [field1.value] [field2.value] [field3.value] - > field4.value

prefix1_1 - > prefix2_ [field1.value] [field2.value] [field3.value] - > field4.value

prefix1_2-> prefix2_ [field1.value] [field2.value] [field3.value] - > field4.value

要執行串行訪問,請使用「prefix1」遍歷鍵。要執行隨機訪問,請使用帶有「prefix2」的鍵和組成鍵的字段。

我希望它很清楚。