私はPHPでmemcachedを使用して、db-readsを回避するために大量のキャッシュを試みています。更新時にキャッシュを無効にしています(アプリケーションが無効になります)。しかし、古いキャッシュデータは大きな問題になりつつあります。ほとんどの場合、これは無効化のバグが原因です(間違ったキーを無効にするか、UPDATEのキャッシュエントリを無効にするのを忘れています)。
開発/本番中にこれらのタイプのバグを検出/デバッグするための良い方法はありますか?
最善の方法は、mysql_query の周りにラッパー関数を配置することです。その中で、クエリがキャッシュされたテーブルへの更新または削除であるかどうかを確認し、変更されているキーを解析します。これは書くのに時間がかからず、テストも簡単で、キャッシュの無効化を二度と忘れることがなくなります。
楽観的同時実行制御を使用できます。これには、テーブルにもう1つの列(タイムスタンプまたは同等のもの、または単なるint)を追加し、更新を行うときにそれを使用することが含まれます。使用方法は次のとおりです(プレーンintが「バージョンタグ」の場合)。
update BlogPost set PublishedOn = :publishedOn, VersionTag = VersionTag + 1
where ID = :id and VersionTag = :versionTag
また、タイムスタンプがDBMSによって自動的に更新されると仮定すると、これはタイムスタンプで行われる方法です。
update BlogPost set PublishedOn = :publishedOn
where ID = :id and Timestamp = :timestamp