1

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 <'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

それはいくつかの要因に依存します: これはスケーラブルであるはずですか? このリストはユーザー固有のもので、同じリストに対して「追加」が同時に 2 回呼び出されることはないと確信できますか? - 競合状態はリスクです。

membase にジェネリック リストを格納するような実装を行いましたが、これはユーザー固有であるため、競合状態が発生しないことはほぼ確実です。

また、シリアル化されたリストのボリュームも考慮する必要があります。これは、大きい可能性があります。私の場合、リストはかなり小さかった。

それが役立つかどうかはわかりませんが、membase を介したランダムアクセス (二重間接参照) を使用して、非常に基本的な反復可能なリストを実装しました。ランダム アクセスは複合キー (複数のフィールドで構成される) を介して行われます。

必要がある:

  1. リストの長さを保持するキーを持っています。
  2. 複合キーを構築する機能を持っています (例: オブジェクトからの 1 つ以上のフィールド)。
  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 に答える