0

バックグラウンド

クエリが既に実行されているかどうかを純粋に保存しようとしています。存在する場合、クエリはデータのキャッシュ (内部データベース、アウト プロセス) に対して実行する必要があり、そうでない場合は、元のデータ ソース (サード パーティの外部 Web サービス) に対して実行する必要があります。このキャッシュの動機は、この API に対して許可されている呼び出しの数が制限されており、同じクエリを複数回実行する可能性が高いことです。

クエリが元のデータ ソースに対して 1 回実行されると、その後の呼び出しではキャッシュされたデータ ソースに対してのみ実行されます。注:この質問では、わかりやすくするために、キャッシュの有効期限の問題を意図的に無視しています。

各クエリに多くのパラメーター (現在は 5 つだけ) が含まれている可能性があり、パラメーターの数が時間の経過とともに増加する可能性があることを考えると、キャッシュされたデータソースに対して"WHERE x AND y AND z AND a AND b AND c"のようなクエリを実行したくありません。そして、そして…」 .

そのためには、この正確なクエリが以前に実行されたかどうかを知りたいだけです。実行されている場合は、そのデータがキャッシュされたデータストアで既に利用可能であると想定します (別の形式ではありますが)。同じパラメーターと関連する値を持つクエリを識別する何らかの形式の「キャッシュキー」が機能すると思います。クエリを試行するたびに、クエリ オブジェクトの状態に基づいてキャッシュ キーを生成し、キャッシュ キー ストアをチェックして、クエリが以前に実行されたことがあるかどうかを確認します。キャッシュキー ストアは、高速な検索を容易にする必要があります。

質問

私が解決するのが難しいと感じているのは、このキャッシュキーがどのように見えるべきか、そしてそれを生成する方法です。これまでのところ、私は傾いています

  1. 興味深いクエリ パラメータとその値を連結してバイト配列にする
  2. バイト配列から MD5 を作成する
  3. このキャッシュキーを binary(16) インデックス付き列に保存します

議論のために、可能性がかなり小さいことが与えられていない場合に、キャッシュされたデータがクエリに使用可能であるとキャッシュが報告する結果になる可能性のある衝突があることを受け入れたいと思います(ただし、私がどれほど小さいかm 100% 確実ではありません)。

キャッシュキーを作成するための上記の解決策は妥当と思われますか、それとも他に考慮すべき方法はありますか?

4

1 に答える 1

1

あなたの潜在的な解決策は、まさに私が過去に行ったことであり、うまく機能しています。実際にメソッド/呼び出し名を連結し、すべてのパラメーター値を文字列にまとめてから、MD5 を実行してキャッシュ キーを取得しました。

どうやって衝突が起こるのかわかりません。パラメータ値を変更すると、キャッシュ キーが異なり、異なるデータが返される可能性があります。

(つまり、「興味深い」パラメーターの意味がわかりません。)

于 2013-02-12T21:03:02.070 に答える