Membase服务器和Enyim - 集成LINQ和/或集合

时间:2011-10-29 00:31:58

标签: c# linq caching memcached membase

我刚安装了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的“列表”?

1 个答案:

答案 0 :(得分:1)

这取决于几个因素: 这应该是可扩展的吗?此列表是否是特定于用户的,您可以确定同一列表不会同时调用“添加”两次? - 竞争条件是一种风险。

我确实实现了这样的事情,我在membase中存储了一个通用列表,但它是特定于用户的,所以我可以肯定没有竞争条件。

您还应该考虑序列化列表的卷,这可能很大。我的情况是列表非常小。

不确定它是否有帮助,但我实现了一个非常基本的可迭代列表,其中包含对membase的随机访问(通过双重间接)。随机访问是通过复合键(由几个字段组成)完成的。

你需要:

  1. 拥有一个包含列表长度的密钥。
  2. 能够构建复合键(例如,对象中的一个或多个字段)。
  3. 拥有您想要保存的值(例如,另一个字段)。
  4. 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”的键和组成键的字段。

    我希望它足够清楚。