私は最近、PHP アプリのスケーラビリティに関する多くの記事を読んでいます。私が読んだほとんどすべての記事でキャッシングについて言及していたので、過剰な DB クエリを防ぐために、クラス プロパティに DB データをキャッシングするというアイデアを思いつきました。私はそのアイデアを共有したかったので、それについてブログに書きました. 無意味でばかげたという言葉を使う以外に、彼はそれがなぜ悪いのかを本当に説明できませんでした. PHP アプリケーションのスケーリングを支援するためのこのキャッシング方法がなぜ悪いのか、誰かここで説明してもらえますか?
メソッド:
仮説:
DB から (必要に応じて) すべてのメソッドでデータをフェッチし、クエリを次々と実行する代わりに、フェッチした DB データを格納するクラス プロパティ (変数) を用意して、重複の必要性を防ぐことをお勧めします。同じデータを返すクエリ。
わからない場合は、私のブログから抜粋した例を次に示します。
説明を少し簡単にするために、Facebook をこの例に取り入れます。ソーシャル ネットワークのユーザー クラスを再コーディングしているとしましょう。
class FBuser
{
}
このクラスに含まれる明らかなメソッドは次のとおりです。
getStatusUpdates()
getAccountInfo()
getFriendIDs()
本来、これらのメソッドは、必要なデータを取得するためにデータベース クエリを実行する必要がありました。しかし、キャッシング メソッドを使用すると、キャッシュされたデータを格納するクラス プロパティを定義し、すべての DB クエリを 1 つのメソッドで実行できます。
class FBuser
{
private $userCache = array();
private function getData( $dataToGet = '' )
{
//all of my db querying would happen here
}
}
ただし、同じ方法で、許可されている場合はキャッシュも探します。
private function getData( $dataToGet = '' , $useCache = true )
{
//am I allowed to use cache?
if ( $useCache === true )
{
//does the appropriate data exist in cache?
if ( isset($this->userCache[ $dataToGet ]) )
{
return $this->userCache[ $dataToGet ];//return the cached data, and forget about the DB queries
}
}
//if we get here, caching was disabled or the required data has not yet been cached :(
//all of my db querying would happen here
//store the data that's just been fetched by the queries in the cache property
}
getData( 'the data I want' , true );
このようにして、DB からデータを取得したいときにいつでも呼び出すことができ、可能な場合にキャッシュされたデータを使用できます。
したがってgetAccountInfo()
、getStatusUpdates()
またはgetFriendIDs()
複数回呼び出す必要がある場合、このメソッドは複数の DB クエリが実行されるのを防ぎます = スケーリングに適しています (私はそう思います)。