Webサーバーでのリソース集中型SQLクエリのキャッシュについて

この記事では、キャッシュシステムの作成者が犯したよくある間違いについて説明します。



それはすべて、リソースが非常に限られていたFreeBSD刑務所でホストされているサイトを管理していた遠い時代に始まりました。 なぜそう pdflib拡張機能を使用してレポートと印刷フォームを表示したのは、標準ホスティングの拡張機能セットには含まれていなかったからです。 そこでApacheとPHPをコンパイルし、そこにドキュメントをアップロードし、サイトは機能しました。



店舗で販売されているトップ10の商品をサイトのページに表示する必要があるまで、すべてが順調でした。 目的のデータセットを作成したSQLクエリが完了するまでに約10秒かかりました。 キー、説明、その他のシャーマニズムは役に立たなかった。 データキャッシングを行う必要がありました。 そして、私は他の人がそれをどのように行うかを見て、リクエストデータをキャッシュするコードを書きました。



私のコードは何をしましたか。



1.キャッシュ内に必要なデータを持つオブジェクトがあるかどうかを確認し、必要な場合はキャッシュからオブジェクトを取得し、受信したデータを使用しました。 そこになければ、必要なデータを生成してキャッシュに保存するコードを実行します。



2.データを使用した後、「ガベージコレクション」手順が開始されました。 有効期限が切れたオブジェクトは削除されました。



すべてが整っているようです。 abユーティリティを使用して、テストマシンでキャッシュをテストし、有望な結果を得ました。 その後、コードをjailにアップロードしました。 そして静かに寝ました。



しかし、翌日、ホスティング管理者から、SQLサーバーに負荷がかかりすぎたためにサイトがブロックされたという手紙を受け取りました。



ソリューションの鍵は、サーバーの負荷のグラフによって私に与えられました。 キャッシュオブジェクトの寿命にほぼ等しい頻度で、負荷が急激に増加しました。 本当に何が起こったのですか? すべてが非常に簡単です。



キャッシュオブジェクトの有効期限が切れると、要求が実行されたときにキャッシュオブジェクトが削除されました。 次のhttp要求は、キャッシュオブジェクトの作成プロセスを開始しました。このプロセスは、しばらくの間続き、SQLサーバーに対して高価なクエリを実行しました。 この間に、別のhttp要求が発生しました。 キャッシュオブジェクトを作成する手順も開始しました。 サーバーの負荷が2倍になり、SQLクエリの実行時間が2倍に増加しました。 SQLクエリの実行の待機時間が長くなっている間に、別のhttpクエリが発生しました。 などなど。



画像



これを避ける方法は?



1.キャッシュオブジェクトが古くなっていることを発見したプロセスは、それを削除すべきではありません。



2.要求を実行し、キャッシュオブジェクトを再作成するプロセスは、他のプロセスが更新手順を開始しないようにフラグを設定する必要があります。



3.新しいデータを受信した後、キャッシュオブジェクトをアトミック(高速)操作に置き換え、その後フラグをオフにします。



宿題として、キャッシュシステムの構築方法を確認してください。



All Articles