1

我刚刚为 .NET 安装了 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'> 在我的应用程序中使用 a 并希望用 membase/memcached 类型的方法替换它。

将项目添加到 List<'T'> 或在缓存列表上使用 Linq 运算符的类似模式怎么样?在我看来,将整个 List<'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 的“列表”?

4

1 回答 1

1

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

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

您还应该考虑序列化列表的数量,它可能很大。我的情况是列表很小。

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

你需要:

  1. 有一个保存列表长度的键。
  2. 具有构建复合键的能力(例如,对象中的一个或多个字段)。
  3. 具有您想要保存的值(例如另一个字段)。

例如:

列表长度 = 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”的密钥以及组成密钥的字段。

我希望它足够清楚。

于 2011-10-29T01:08:55.663 回答