0

シリアル化されたオブジェクト (または何でも) をキー/値キャッシュに格納したいと考えています。

今、私はこのようなことをします:

public string getValue(int param1, string param2, etc )
{
    string key = param1+"_"+param2+"_"+etc;

    string tmp = getFromCache();
    if (tmp == null)
    {
       tmp = getFromAnotherPlace();
       addToCache( key, tmp);
    }
    return tmp;
}

むずかしいと思います。どのようにキーを設計できますか?

4

2 に答える 2

1

質問を理解していれば、キーを作成する最も簡単でスマートな方法は、MD5、SHA1 ecc などの一方向ハッシュ関数を使用することだと思います...

これを行う理由は少なくとも 2 つあります。

  1. 結果として得られる鍵は確かにユニークです! (実際には MD5 と SHA1 の両方がクラックされています (= )
  2. 結果のキーの長さは固定されています。

関数の引数としてオブジェクトを指定する必要があり、一意のキーがあります。私はC#についてあまり知りませんが、組み込みの一方向ハッシュ関数を見つけることができると確信しています.

于 2012-03-02T10:38:15.483 に答える
0

まず、キーは多くの文字で構成されているようです。キー名も​​メモリ (1 バイト/文字) を占有するので、できるだけ短くするようにしてください。キー名が値よりも大きい状況を見てきました。これは、空の配列または空の値を格納する場合に発生する可能性があります。

キー構造。あなたの例から、保存したいオブジェクトはパラメーターによって識別されると思います(1つはおそらくアイテムIDであるか、検索用のフィルターです[...])。プレフィックスから始めます。プレフィックスは、オブジェクト クラスの名前 (またはオブジェクト全般を表す簡略化された名前) にする必要があります。

ほとんどの場合、キーにはプレフィックスと識別子が含まれます。あなたの例では、複数の識別子があります。そのうちの 1 つが一意の ID である場合は、onlyprefix + idで十分です。

オブジェクトが大きく、常にすべてを使用するとは限らない場合は、戦略を複数のキー ストレージに変更します。最も一般的な値を格納するため、または値が個別のキーに格納されるオブジェクトのコンポーネントを格納するために、1 つのメイン キーを使用します。パイプを利用し、1 つの「複数の」クエリを使用して 1 つの接続でオブジェクト全体を取得します。

 mainKey = prefix + objectId;
 object = getFromCache(mainKey);

 startCachePipeline();
 foreach (object[properties] as property) {
      object->property = getFromCache(prefix + objectId + property);
 }
 endCachePipeline();

「Person」オブジェクトの例の構造は次のようになります。

 person_33 = array(
      properties => array(age, height, weight)
 );
 person_33_age = 28;
 person_33_height = 6;
 person_33_weight = 150;

Memcached は、内部に格納されているオブジェクトのサイズが類似している場合にメモリを最も効率的に使用します。オブジェクト間のサイズの差が大きいほど (1 つの失われた大きなオブジェクトや特異なケースについては話していませんが、メモリも無駄になります)、無駄なメモリが多くなります。

それが役に立てば幸い!

于 2012-01-20T18:00:51.140 に答える