0

文字列値を受け取り、それをユーザー レコードと照合し、一致するユーザーのレコードを返すメソッドを作成しました。

私のコード:

class UsersPeer extends BaseUsersPeer
{
  public static function getHashUser($hash)
  {
    $c = new Criteria();
    $c->add(UsersPeer::HASH,$hash);
    return UsersPeer::doSelectOne($c);
  }
}

この関数をキャッシュするのは理にかなっていますか?

私の理解では、関数に渡される文字列値はユーザーごとに常に異なるため、関数は毎回実行されるとのことです。ただし、以前に文字列値がメソッドに渡され、取得されたレコードがあるユーザーに対しては、再度実行されません。そのような場合にのみ、関数のキャッシュが機能します。

約 50,000 人のユーザーがいることを考えると、この方法でキャッシュを有効にする意味はありますか?

4

1 に答える 1

2

これは非常に単純なクエリであり、ハッシュ列にインデックスが付けられていない場合でも高速である必要があります(インデックスが付けられている場合は非常に高速です)。結果をキャッシュする理由はありません。

結果キャッシュは、クエリが複雑で、集合データまたはサブクエリが含まれている状況でよく使用されます。それでも、最初にクエリに取り組み、最適化できるかどうかを確認する必要があります。

更新

クラス(すべての具象キャッシュ実装のベース)をチェックアウトするsfCacheと、キャッシュに保存するものにはすべて有効期間があることがわかります。つまり、限られた時間だけ保存されます。これは、キャッシュのサイズが制限されていることを意味します。

キャッシュは次のように機能します。

  • 関数が呼び出されます
  • 関数名とパラメータからキャッシュキーを計算します
  • 指定されたキーでプリペイドカードがあるかどうかをキャッシュに確認します
  • はいの場合、それをフェッチして返します
  • 戻り値を計算します
  • キャッシュに保存してから返します

関数の戻り値をキャッシュする価値があるかどうかは、常にパフォーマンス測定次第です。これは、実行時間の長い、計算量の多い関数ですか?それはパフォーマンスのボトルネックですか?答えが肯定的な場合は、キャッシュを有効にする価値があります。

また、関数キャッシングを実行するたびに、維持する必要のあるコードの量(および複雑さ)が増​​加することを忘れないでください。

于 2012-09-14T12:13:45.173 に答える