joomlaキャッシュクラスのコードを調べていると、キャッシュファイルにアクセスしてキャッシュが利用可能な場合は読み込もうとしたとき、利用できない場合は書き込みをしようとしたときにのみ、群れベースのロックが発生することがわかりました。
今、私はこの問題に直面しています:2人の訪問者が同時に同じページにヒットし(1秒の分割)、キャッシュが利用できず、最初のヒットは次のようになります:
- ファイルを探します : 利用可能なキャッシュ ファイルがありません -> 実行してからファイルにキャッシュする必要があります - その新しいファイルをロックします - コストのかかるコードを実行します - 結果をファイルに書き込みます - ロックを解除して結果を返します
2 番目のヒット、1 秒後は :
-ファイルを探します: 最初の PHP プロセス (1 のヒット) がファイルに書き込むデータを生成するためにまだビジー状態であるため、利用可能なキャッシュ ファイルがありません -> そのため、この PHP プロセスはいくつかのコードも実行し、それをファイルにキャッシュすることを決定します ( -ファイルのロックを試みます (最初のプロセスが書き込みを終了するまで待機します) -同じコストのかかるコードを無駄に再実行します -結果をファイルに再度書き込みます! -ロックを解除して結果を返す
この正確なシナリオは、キャッシュが負荷の急増の最中に無効になり、Web サイトが同じコードを同時に 10 回以上実行しようとするたびに発生します (重い SQL 処理を実行します)。MySQL を強制終了し、さらに厄介なことを実行します.
私のように、ロックをよりスマートにし、同じキャッシュ アイテムが連続して何度も再生成されないようにする必要があると思いますか? はいの場合、誰かがこれを修正する方法を見つけましたか? その正確な瞬間にキャッシングの利点を失いました...
それとも何かが足りないようなものですか?