キーベースのキャッシュの有効期限がどのように機能するかという名前の 37signals ブログの投稿について話し合いたいと思います。私は RoR ではなく Django の開発者です。Ross Poulton による Django の「翻訳」は次のとおりです: Django によるキーベースのキャッシュ有効期限。
ご覧のとおり、主なアイデアは次のとおりです。1 つのオブジェクトに複数のレベルの他のオブジェクトが含まれる「ロシア人形」構造があります。
class A:
timestamp updated_at;
class B:
A parent;
timestamp updated_at;
class C:
B parent;
timestamp updated_at;
クラス A のオブジェクトのビュー (HTML など) は、関連するすべてのオブジェクトとともにキャッシュされます。クラス C が更新されると、次のものが必要になります。
- C のタイムスタンプを更新します。
- B のタイムスタンプを更新します。
- A のタイムスタンプを更新します。
この後、クラス A のビューにアクセスするときは、次のものが必要です。
- A からタイムスタンプを取得するために SELECT を作成します。
- このタイムスタンプを持つオブジェクトがキャッシュされていないことを確認してください。再キャッシュする必要があります。
- SELECT して A データを取得します。
- B からすべてのタイムスタンプを取得するために SELECT を作成します。
- キャッシュに存在する B を取得します。
- SELECT を実行して、キャッシュに存在しない B を取得します。
- SELECT を実行して、キャッシュに存在しない B に関連する C のすべてのタイムスタンプを取得します。
- 存在する場合、キャッシュから C を取得します。
- SELECT を実行して、キャッシュに存在しない C を取得します。
したがって、この戦略を正しく理解していれば、DB に対して 6 つのクエリを実行する必要があります。オブジェクトごとに 2 つです。
代わりに、すべてのデータをリセットする場合は、3 つのクエリのみを行う必要があります。
- オブジェクト A を取得します。
- 関連オブジェクトを取得 B.
- 関連オブジェクトを取得 C.
私が知っているように、より少ないデータで 6 つのクエリを実行するよりも、より多くのデータで 3 つのクエリを実行する方が良い場合がよくあります。では、この戦略は効果的ですか?
もちろん、タイムスタンプをキャッシュに保存することもできますが、この場合、タイムスタンプの無効化の問題に直面します。したがって、無効化を回避するために必要な戦略のためにデータを無効化することは意味がありません。
このアルゴリズムの範囲または動作原理の理解が間違っている場合は、訂正してください。