![画像](https://habrastorage.org/getpro/habr/post_images/06f/ae4/f08/06fae4f08e416c5ff52878411a984f7d.jpg)
個人的には、私は望んでいましたが、長い間うまくいきませんでした。
クエリキャッシュによるデータベース遅延、ブロックキャッシュによるブロック遅延を無効にすると、ページ全体をキャッシュできませんでした...
もちろん、このサイトはずっと速く動作し始めましたが、すでにスローダウンし始めていました... memcached?
データベースクエリはいくつありましたか?
おそらくキャッシュの使用を開始した後、リクエストは少なくなりました。
キャッシュリクエストはいくつありますか?
さらに、複数のmemcachedサーバーを使用するシステムにのみ適用されます。 memcachedまたは1台のサーバーがない場合、影響は最小限になります。
ちょっとした背景
哲学者が言うように、すべては螺旋状に発達します。
3年前、私は小さなスタジオの普通のゲーム開発者でした。VTunで遅延をキャッチするために最適化に費やした時間の70%です。
ご存知のように、ビデオゲームの開発における主な問題の1つは、 DIPを最小化することです。 ロシア語の場合-ビデオカードに何かをレンダリングし、同時にプロセッサが同期または応答を待っている場合、一般的にはアイドル状態です...
モンスターは同じ方法で1万個の三角形と1万個の三角形にレンダリングされたことが判明しました。
同期を回避するため、または遅延を減らすためのさまざまな方法とトリックがありました...
このビジネスのヘルパーの1つは、レンダリングツリーであるSceneGraphでした。
一番下の行は単純です-可能であれば、類似したオブジェクトを一緒にレンダリングして、レンダリング間で可能な限り少ない変数を変更できるようにします。
3年が経過し、ハブに座ってFacebookがmemcachedをダウンロードした方法を読んでいます...
突然、式に注目し、 複数のget(並行して数百のキーの取得)のアプリケーションレベルのフロー制御を実装します 。
それから私は夢中になりました...
テンプレートエンジンは通常どのように機能しますか?
テンプレートを受け取り、QUEUEは必要な場所を以前にQUEUE値が設定されていた値に置き換えます。
以下を想像してください
<ahref='{OBJECT_HREF►'>{OBJECT_LABEL} </a>
そしてできれば100回のサイクルで...
また、キャッシュから変数を取得することも想定しています。
mmmm 200クエリになりますか?
別のトリッキーなタグがある場合(再びsmiraに感謝)-その後400+
タスクが気に入らず、指定されたブロック全体をキャッシュに置く場合、ページにそのようなブロックが5つあり、1つが突然再生することになったと仮定します。
ゲームエンジンがやりたいように、ページのレンダリングを作成しましょう- 多くのウォークスルー ...
パス1-テンプレートを収集し、使用済みのキーを収集し、テンプレート内の「場所」をいくつかのアンカーに置き換えます...
パス2-1つのバンドル(muti-get)ですべてのキーを要求します。
パス3-キータグを収集し、バンドルをリクエストします。
パス3-どのキャッシュが生きているかを判断します。 無生物BUNCHについては、パッセージ1を開始します
仕組み
5つのブロックがあり、それぞれ100個の要素があります。
pass2では、5つのキーを要求します-5ブロックの値
pass3では、タグをリクエストします(5つ以上カウントします)
2つのブロックの有効期限が切れていると仮定します
Pass3は2ブロックのpass1を開始します。 次に、2つのブロックから200個のキーをすぐに要求するパッセージ2があります...
結果-すべてのブロックが「生きている」場合、10(5ブロック+ 5タグ)の代わりに、1パックで5つの2つのリクエストを行います。
ブロックキャッシュが停止している場合、200 ...の代わりに2つのリクエスト(100の値+ 100のタグ(ある場合))を行います...
しかし、それをどのようにまとめるか。
これを通常のツリーでラップできます。 カウント。 CacheGraphで。
ツリーを一周し、不明なキーがあればそれを収集し、バンドルを要求してさらにツリーに沿ってクロールします。
受信した値のテンプレート内のアンカーの大きなstr_replaceの終わり(または、値の置換を伴うツリーの別のトラバーサル、誰でも好きなように)
その結果、非同期ソースへのアクセスが最小化され、同期と応答のレイテンシが最小化されます。 仕事の加速。
一部のタスクで非常に深刻な加速
ボーナス:キャッシュされた要素がスタンドアロンになっている場合、ツリーは、たとえばC ++でシリアル化およびバイパスできます。
キャッシュが期限切れになった場合は、スタンドアロンブロックを生成するリクエストでphpの束を再度実行できます...
これについて私は個人的に何を言うことができますか?
どういうわけか不滅のカシュチェイはdrれた。 彼は最も高い橋から嵐の川に急いで行きました...そして電車の下で...そして彼は高層ビルから飛び降りました...そして彼は塩酸でプールに蹴りました...そして彼はシアン化物カリウムを飲み込みました...