memcached と従来の memcached-object-read-with-sql-server-fallback を使用するファンタジー フットボール アプリケーションがあります。これはかなりうまく機能しますが、最近、関連するオーバーヘッドと、これが最善のアプローチであるかどうかを考えています。
適切な例 - ユーザー チームのドロップダウン リストを生成する必要があるため、次のパターンに従います。
- memcached からユーザー チームのリストを取得する
- 利用できない場合は、SQL サーバーからリストを取得し、memcached に保存します。
- マルチゲットを実行して、チーム オブジェクトを取得します。
- これらの SQL ストアからのオブジェクトの読み込みにフォールバックします。
これはまったく問題ありません。キャッシュされた各データは比較的簡単にキャッシュおよび無効化されますが、これには 2 つの大きな欠点があります。
1) オブジェクトを操作しているため、かなり大きなオーバーヘッドが発生しています。1 つのチームが memcached で数百バイトを占めており、この場合に本当に必要なのはチーム名と ID のリストだけです。チーム オブジェクト。
2) 個々のオブジェクトをロードするためのフォールバックのため、空のキャッシュまたはアイテムの有効期限が切れたときに生成される SQL クエリの数は膨大になる可能性があります。 WHERE Id IN (...) 20 x Store in memcached したがって、この 1 つのクエリだけで 21 のネットワーク リクエストが発生し、IN クエリは特定の結合よりも遅くなります。
明らかに、単純なことを行うことができます
SELECT Id, Name FROM Teams WHERE UserId = XYZ
その結果をキャッシュしますが、これは、ユーザーが新しいチームを作成するたびに、このデータを明確に無効にする必要があることを意味します。この場合、比較的単純に見えるかもしれませんが、これらのタイプのクエリの多くがあり、それらの多くは簡単に無効化されない軸で動作します (友人が特定の場所で作成したチームの ID と名前のリストなど)。ゲーム)。
すっごく..私の質問は-言及された欠点を解決するためのアイデアを持っている人はいますか、それともオーバーヘッドがあり、キャッシュミスが悪いことを受け入れる必要がありますか?