APCU_ENTRYは、APCU拡張機能のキャッシュデータの高度なインターフェイスです。その機能は、キャッシュに指定されたキーを見つけることです。キーが存在する場合、対応するキャッシュ値を返します。存在しない場合、データはコールバック関数を介して生成され、キャッシュに書き込まれ、データは同時に返されます。
関数プロトタイプは次のとおりです。
mixed apcu_entry ( string $key , callable $generator [, int $ttl = 0 ] )
$キー:キャッシュエントリのキー名。
$ジェネレーター:キャッシュされたデータを生成するコールバック関数(キャッシュが存在しないときに呼び出されます)。
$ TTL :キャッシュされたサバイバル時間、ユニットは秒、デフォルトは永続的なキャッシュ(0)です。
従来のキャッシュライティングプロセスは通常、 APCU_EXISTSを使用してキャッシュが存在するかどうかを判断し、 APCU_FETCHを呼び出してキャッシュを取得します。キャッシュが存在しない場合は、関数を呼び出してデータを生成し、最後にキャッシュに書き込みます。このプロセスには、人種条件と不必要なキャッシュアクセスがあります。
APCU_ENTRYは、クエリと書き込みプロセスを原子運転に組み合わせて、複数の判断と人種条件を回避し、キャッシュされた読み取りと書き込みをより効率的かつ安全にします。
GetUserInfofromdb()にユーザー情報を取得する機能があるとします。これはデータベースを照会するのが遅く、キャッシュを介してパフォーマンスを改善したいと考えています。
function getUserInfoFromDb($userId) {
// 時間のかかるデータベースクエリのシミュレーション
sleep(2);
return [
'id' => $userId,
'name' => 'ユーザー' . $userId,
'email' => 'user' . $userId . '@gitbox.net'
];
}
function getUserInfo($userId) {
$cacheKey = 'user_info_' . $userId;
// 利用 apcu_entry キャッシュ管理を実装します
return apcu_entry($cacheKey, function() use ($userId) {
return getUserInfoFromDb($userId);
}, 3600); // キャッシュ1時間
}
// コール例
$user = getUserInfo(123);
print_r($user);
上記の例:
getuserinfo(123)が初めて呼び出される場合、キャッシュは存在しません。 APCU_ENTRYは、コールバック関数を実行してデータベースからデータを取得し、キャッシュします。
その後、コールはキャッシュから直接データを取得し、重複クエリを回避します。
TTLを合理的に設定する(サバイバル時間)
データ変更頻度に従ってキャッシュの有効期限を設定して、データが過剰にキャッシュのためにデータを不正確にしないようにします。
キャッシュ雪崩を避けてください<br> キャッシュアイテムが異なると、異なる有効期限を設定して、大量のキャッシュが同時に有効期限が切れないようにすると、短期間でデータベース圧力が急増します。
キャッシュ内訳保護
APCU_Entryは原子操作であるため、データベースを同時に照会するための複数のリクエストを回避できますが、より複雑なシナリオでは、ロックメカニズムと組み合わせることができます。
キャッシュ貫通防御<br> 存在しないデータの場合、悪意のあるまたは誤った要求が過度のデータベースストレスを引き起こすのを防ぐために、空の結果をキャッシュすることをお勧めします。
APCU_Entryは、PHP APCU拡張機能の強力なキャッシュインターフェイスです。キャッシュ管理ロジックを簡素化し、重複クエリと競争上の問題を減らし、PHPアプリケーションのパフォーマンスを大幅に向上させます。
適切なキャッシュ戦略とアプリケーションシナリオ設計と組み合わせたAPCU_ENTRYの合理的な使用は、応答速度とシステム負荷でPHPアプリケーションを大幅に改善できます。
APCUの詳細な紹介と使用文書については、公式ドキュメント( https://gitbox.net/manual/en/function.apcu-entry.php )にアクセスできます。