6

memcached は初めてで、使い始めたばかりです。いくつか質問があります:

  1. MemCached を php データベース クラスに実装しました。結果セット (配列) を memcache に格納しています。私の質問は、ウェブサイトの場合と同様に、たとえば 4 人のユーザーが同じページと同じクエリ実行プロセスにアクセスした場合、memcache はどうなるでしょうか? 1 人のユーザーに対する私の理解によると、残りの 3 システムは Memcache を使用するため、DB からフェッチします。そうですか?

  2. 4 ユーザーということは、memcache のオブジェクトが生成されるということですか? しかし、すべてが同じメモリを使用しますか? Web サイトの 2 つの異なるページに同じことが当てはまりますか? ビットページが使用するように

    $obj = memcached->connect(parameter);
    
  3. 私は小さなテストを実行しました。通常の mysql ステートメントでクエリを実行すると、コードが memcached を使用する場合よりも実行時間が短くなりますか? 何故ですか?その場合、memcache が書き込まれているすべての場所が高速なのはなぜですか。

  4. mormal と比較して memcached の実行時間を効果的にテストする例を挙げてくださいmysql_fetch_object

4

3 に答える 3

4
  1. Memcache は「自動的に」機能しません。キー => 値マップのみです。それがどのように使用されるかを決定し、実装する必要があります。

    A. memcache
    からの取得を試みる
    B. A. 失敗した場合、db から取得し、memcache に追加する
    C. 結果を返す
    D. そのデータを更新する場合は、関連するすべてのキーを期限切れにする

    これにより、データベースで同じクエリが複数回実行されるのを防ぐことはできません。2 人のユーザーが同時に同じデータを取得し、すべてがほぼ同時に実行された場合、memcache からフェッチしようとする両方の試行が失敗し、memcache に追加されます。そして、それは通常大丈夫です。

  2. コードでは、各ユーザーに対して実行されるphpから実行されるため、現在のユーザーと同じ数の接続が作成されます。また、(コードに注意しないと) 複数回接続する可能性があるため、さらに多くの回数になる可能性があります。

  3. 多くの場合、memcache と sql の両方の最大の遅延は、実際にはネットワーク レイテンシです。SQL が同じマシンにあり、memcache が別のマシンにある場合、memcache の時間が遅くなる可能性があります。

    また、多くのフレームワーク/人々はマルチ取得を正しく実装していません。したがって、100 個の ID があり、memcache から ID で取得する場合、1 回のマルチ取得ではなく、100 回の単一取得が行われます。それは大幅な減速です。

    Memcache は高速です。単純な選択のクエリ キャッシュを使用した SQL も高速です。通常、次の場合に memcache を使用します。

    実行しているクエリが複雑/遅い、
    または
    memcache を使用した方が費用対効果が高く、全員が SQL サーバーにアクセスする、
    または
    ユーザーが多すぎてデータベースが負荷に追いつくことができない、
    または
    試してみたい履歴書に記載するのがクールまたはいいと思うからです。

  4. xdebug や Phprof など、さまざまなプロファイリング ソフトウェアを使用できます。

または、サーバーで他のことが起こっているため信頼性は低くなりますが、これを行うことができます。

$start = microtime(true);
// do foo
echo microtime(true) - $start;

$start = microtime(true);
// do bar
echo microtime(true) - $start;
于 2012-07-20T15:23:12.310 に答える
3

memcache を使用する理由は 2 つあります。

1. データベース サーバーの負荷を軽減する

つまり、同じことを何度も何度もクエリし続け、内部の mysql キャッシュが期待どおりに高速に動作しないために、データベース サーバーに高い負荷がかかっている場合です。または、サーバーを詰まらせている書き込みパフォーマンスに関する問題がある場合、memcache は mysql を一貫したより良い方法でオフロードするのに役立ちます。

あなた自身のサーバーに負荷がかかっていない場合、memcached を使用するメリットが主にパフォーマンス向上のためである場合、メリットはありません。Memcached は依然としてサーバーであり、接続して対話する必要があるため、ネットワークの側面は引き続き維持されます。

2. データベースに依存せずにユーザー間でデータを共有

別のシナリオでは、ファイルや SQL サーバーに依存せずに、Web アプリケーションのユーザー間でデータや状態を共有したい場合があります。memcached を使用すると、ユーザーの観点から値を設定し、別のユーザーからそれをロードできます。

その良い例は、ユーザー間のチャット ログです。多くの書き込みと読み取りが行われるため、すべてをデータベースに保存したくありません。データを共有したいので、エラーが発生した場合にすべてを失うことは気にしません。がやって来て、サーバーが再起動します...

私の答えが満足のいくものであることを願っています。

幸運を

于 2012-07-20T14:58:23.570 に答える
1
  1. はいそうです。基本的にこれはキャッシングと呼ばれ、Memcached 自体とは関係ありません。

  2. よくわかりません。4 人のユーザー全員が同じ memchache デーモンに接続すると、共有メモリが使用されます。

  3. コードを指定していないため、わかりにくいです。多くの理由が考えられるので、与えられた情報が少ないから結論を急ぐつもりはありません。

  4. 両方の実行時間を効果的にテストおよび比較するには、ディープ パケット インスペクションを使用してネットワーク トラフィックを測定する必要があります。この回答では、その例を挙げることはできません。microtimeキャッシュがヒットした (結果が既にキャッシュにあった) か失敗した (まだキャッシュにないため、データベースから取得する必要がある) かどうかをログに記録するだけで問題ない場合があります。

于 2012-07-20T15:00:17.270 に答える