2011-07-09 7 views
2

私は、同じ引数を使って呼び出される操作と頻度を犠牲にして、戻り値をキャッシュすることで利益を得る方法に取り組んでいます。PHPの配列検索速度。長いキャッシュキー

私はserialize()をキャッシュキー用に一緒に使用しますが、これは長い配列引数のために非常に長いキーになる可能性があります。

  • んPHP配列のインデックスとルックアップを、このような長いキー(が250Bから1kBの+に思う)に苦しみますか?
  • これまでのところとても良いですが、私はある時点でこれがすばらしく失敗する状況に直面していますか?
  • 基本的には、私はmd5()または代替)キーですか?

マイナー明確化
これが無い永久記憶を持つ唯一の要求ごとのキャッシング、です。問題のメソッドはビューヘルパーのメソッドであり、ビューの生成ごとに500回以上呼び出すことができます。

+0

どうにかして、シリアル化の代わりにMD5を使用するのは奇妙です。 –

+0

@Hans Wassink - 'md5()' 'serialize()'の結果は私が得たものです。 – Dan

+0

まあとにかく、すべての羽ばむ:D –

答えて

4

必ずキーをハッシュしてください。あなたはたぶん "私がいつでもユニークなキーを連結することができるときに、私はコリソンを得る危険がありますか?"と言うでしょう。簡単な答えは、文字列連結を使用してキャッシュキーを生成する場合、ラムの使用量を見積もるために必要なスペースの最悪の場合に常に計​​算しなければならない場合です。

したがって、200個のエントリを持つキャッシュがあり、20個の最大文字列を持つ2個のフィールドがあるとします。最悪の場合は200*2*20*(size of character)となります。可能なすべての並列接続で完全なキャッシュをロードすると、並列接続の量が増えます。

ハッシュでは、常に最小のRAM要件=キーフィールドの最大ラム要件があります。

キーに連結された値が多数ある場合、これは非常に悪くなります。

編集:

リクエストごとに使用する場合でも、配列はメモリを消費します。それはキャッシュであるが、要求の最初から最後まで存在する。だからあなたは、それが一定量のハッシュを使用している間に一定量のメモリを消費することを考慮する必要があります。

第2の点は、キーを比較する必要があることです。文字列キーを持つ連想配列にアクセスする場合、インタープリタはキーをcharwiseで比較する必要があります。キーを生成するためのハッシュメソッドがある場合、これも固定されたステップ数になります。

連結を使用する場合、ステップの量は最高と最悪の場合の範囲になります。

+0

ありがとう@fyr - 私の説明によると、それは要求ごとに、このキャッシュのための永続的なストレージはありません。それにもかかわらず、私の鍵は、ローエンドの30Bから1kB +のような高さまで、巨大になる傾向があります。私は、6つのパラメータ関数を持つ 'serialize(func_get_args())'を行っています。そのうちの3つは深い配列です。私はそれをベンチマークするつもりですが、メモリの保存とデバッグダンプの読みやすさのために、私はハッシュを行うつもりだと思います。 – Dan

1

このような長い配列キーを持つのは確かに典型的なことではありませんが、ベンチマークを実行して実際にどれくらいの減速が起こったかを推測する必要があります。しかし、疑わしい場合は、md5だけです。スピードアップはまだmd5と比べても、後者はささいなことです。