2012-01-19 11 views
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; 
} 

今、私はこのような何かを行います。どのようにキーを設計できますか?

答えて

1

私は質問を理解している場合、私はキーを作るための最も簡単かつスマートな方法は、MD5、SHA1のECCとして一方向のハッシュ関数を使用することだと思う...

これを行うために、少なくとも2つの理由:

  1. たキーは確かにユニークです!(実際にはMD5とSHA1の両方が
  2. 結果のキーが固定な長さを持っている)=(クラックされている!あなたが持っている

あなたのオブジェクトを関数の引数として与え、独自のキーを持っています。 私は非常に多くのC#を知っているわけではありませんが、単方向ハッシュ関数がビルドインされていることは確かです。

+0

このメソッドがハッシュ作成に多くのCPUを必要とするかどうか知っていますか? –

+0

機能が言語で構築されていれば、私は思っています。ペンティアムP5の90MhzでMD5を作ると、毎秒13.2MBになります。 –

+0

okありがとう、私はそれをいくつかのreflexion –

0

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

キーの構造。私はあなたの例から、あなたが保存したいオブジェクトがparamsによって識別されていると推測します(1つはアイテムIDかもしれないし、おそらく検索[...]のためのフィルタかもしれません)。接頭辞で始まります。接頭辞は、オブジェクトクラスの名前(または一般的にオブジェクトを示す簡略化した名前)でなければなりません。

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

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

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

Memcachedの用途:

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

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

例えば構造「人物」オブジェクトは、その後のようなものになるでしょうメモリは、内部に格納されたオブジェクトのサイズが同じ場合に最も効率的です。オブジェクト間のサイズの差が大きければ大きいほど(大きなオブジェクトが1つ失われたり、単一のケースが失われたり、メモリが無駄になりますが)、無駄なメモリが増えます。

希望すると助かります!

+0

私はC#に追加する必要がありますが、重要ではありません。あなたのリフレクションプロセスには多くのCPUが必要ですか? –

関連する問題