我刚安装了membase和.NET的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类型方法替换它。
将项目添加到List&lt;'T'&gt;的类似模式怎么样?或在缓存列表中使用Linq运算符?在我看来,存储整个List&lt;'T'&gt;可能是一个坏主意。在单个键下的缓存中,必须检索它,添加它,然后在每次要添加元素时重新设置它。或者这是一种可以接受的做法吗?
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的“列表”?
答案 0 :(得分:1)
这取决于几个因素: 这应该是可扩展的吗?此列表是否是特定于用户的,您可以确定同一列表不会同时调用“添加”两次? - 竞争条件是一种风险。
我确实实现了这样的事情,我在membase中存储了一个通用列表,但它是特定于用户的,所以我可以肯定没有竞争条件。
您还应该考虑序列化列表的卷,这可能很大。我的情况是列表非常小。
不确定它是否有帮助,但我实现了一个非常基本的可迭代列表,其中包含对membase的随机访问(通过双重间接)。随机访问是通过复合键(由几个字段组成)完成的。
你需要:
E.g:
list_length = 3
prefix1_0-&GT; prefix2_ [field1.value] [field2.value] [field3.value] - &gt; field4.value
prefix1_1-&GT; prefix2_ [field1.value] [field2.value] [field3.value] - &gt; field4.value
prefix1_2-&GT; prefix2_ [field1.value] [field2.value] [field3.value] - &gt; field4.value
要执行串行访问,请使用“prefix1”迭代键。要执行随机访问,请使用带有“prefix2”的键和组成键的字段。
我希望它足够清楚。