Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Membase server和Enyim--集成LINQ和/或集合_C#_Linq_Caching_Memcached_Membase - Fatal编程技术网

C# Membase server和Enyim--集成LINQ和/或集合

C# Membase server和Enyim--集成LINQ和/或集合,c#,linq,caching,memcached,membase,C#,Linq,Caching,Memcached,Membase,我刚刚安装了membase和enyim client for.NET,并看到一篇文章提到了这种集成linq的技术: public static IEnumerable<T> CachedQuery<T> (this IQueryable<T> query, MembaseClient cache, string key) where T : class { object result; if (

我刚刚安装了membase和enyim client for.NET,并看到一篇文章提到了这种集成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;
        }
    }
公共静态IEnumerable CachedQuery
(此IQueryable查询,MembaseClient缓存,字符串键)其中T:class
{
客观结果;
if(cache.TryGet(键,输出结果))
{
返回(IEnumerable)结果;
}
其他的
{
IEnumerable items=query.ToList();
cache.Store(StoreMode.Set、key、items);
退货项目;
}
}
它将首先检查所需数据是否在缓存中,如果没有缓存,则返回它

目前,我正在应用程序中使用
字典
,并希望用membase/memcached类型的方法来替换它

类似的向列表添加项或在缓存列表上使用Linq操作符的模式如何?在我看来,将整个列表存储在缓存中的单个键下,并且必须检索它、添加到它,然后在每次添加元素时重新设置它,这可能是一个坏主意。或者这是一种可以接受的做法

    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); 
        }
    }
public bool Add(T项)
{
对象列表;
if(cache.TryGet(this.Key,out list))
{
var _list=列表为列表;
_列表。添加(项目);
返回cache.Store(StoreMode.Set,this.Key,_list);
}
其他的
{
var_list=新列表(新的T[]{item});
返回cache.Store(StoreMode.Set,this.Key,_list);
}
}

在这样的缓存情况下,通常如何处理集合?是否通常使用散列算法,或某种密钥前缀系统来识别缓存键值存储中T类型的“列表”?

这取决于几个因素: 这应该是可伸缩的吗?此列表是否特定于用户,并且您可以确定不会对同一列表同时调用两次“Add”?-比赛条件是一种风险

我在membase中存储了一个通用列表,但它是特定于用户的,所以我可以非常肯定不会有竞争条件

您还应该考虑序列化列表的体积,这可能很大。我认为我的案子清单很小

不确定它是否有用,但我实现了一个非常基本的迭代列表,通过membase进行随机访问(通过双间接寻址)。通过复合密钥(由多个字段组成)进行随机访问

您需要:

  • 有一个保存列表长度的键
  • 能够构建复合键(例如,对象中的一个或多个字段)
  • 具有要保存的值(例如,另一个字段)
  • 例如:

    列表长度=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”的键和组成键的字段


    我希望它足够清楚。

    这取决于几个因素: 这应该是可伸缩的吗?此列表是否特定于用户,并且您可以确定不会对同一列表同时调用两次“Add”?-比赛条件是一种风险

    我在membase中存储了一个通用列表,但它是特定于用户的,所以我可以非常肯定不会有竞争条件

    您还应该考虑序列化列表的体积,这可能很大。我认为我的案子清单很小

    不确定它是否有用,但我实现了一个非常基本的迭代列表,通过membase进行随机访问(通过双间接寻址)。通过复合密钥(由多个字段组成)进行随机访问

    您需要:

  • 有一个保存列表长度的键
  • 能够构建复合键(例如,对象中的一个或多个字段)
  • 具有要保存的值(例如,另一个字段)
  • 例如:

    列表长度=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”的键和组成键的字段

    我希望足够清楚