12

質問は 2 つの記事に基づいています:
- Basecamp Next by DHH from 37signals
- Advanced Caching in Rails by Adam Hawkins

ロシアの人形のキャッシュを使用することのパフォーマンスへの影響について、私は少し混乱しています。具体的には:

  1. 自動期限切れキーを使用すると、すべてのリクエストがデータベースにアクセスしてオブジェクトのタイムスタンプを取得するように見えます - 何か不足していますか? (最良のシナリオでは、階層の最上位のキーに対してのみそれを行う必要があることを理解していますが、それでも...)

  2. 最初の記事では、todo リストとすべての todo アイテムをキャッシュしています。リストをキャッシュすることは、多くの作業 (すべてのアイテムの DB クエリ) を節約できるため、非常に理にかなっています。しかし、なぜ個々のアイテムをキャッシュするのでしょうか? アイテムのタイムスタンプを取得するために既にデータベースにアクセスしていますが、正確には何を保存しているのでしょうか? いくつかの html 行を生成していますか?

  3. 2 番目の記事で、Adam は次のようにビューのチャンクをキャッシュします: cache [post, 'main-content']... cache [post, 'comments'] コメントが追加されると、投稿のタイム スタンプが変更されるため、両方の全体が無効になります。ただし、main-content変更されていません-再生成したくありません!!! コメントのみを無効にするにはどうすればよいでしょうか。(これは実際には非常に一般的なユーザー ケースです。オブジェクト自体、さまざまな関連付け、他のストア内のデータなど、論理的に独立したいくつかの部分を持つモデルです。)

ロシア人形のキャッシングは、ネストされたオブジェクトの階層が深い場合にのみ意味があるように思えます (basecamp では、プロジェクト -> todos リスト -> todo -> items リストがあります)。ただし、階層が浅い場合は、無効化を自分で行う方がよいでしょう。

フィードバックをいただければ幸いです。
ありがとう。

4

2 に答える 2

6
  1. トップレベルはデータベースにアクセスする必要があります。モデルと ID をキーとして別のキャッシュ エントリにタイムスタンプを保存することで、これを回避できます。記事 1 のコメント投稿者の 1 人 (Manuel F. Lara) は、同じことを提案しました。

  2. ネストの「最低」レベルについては正しいと思います。DB アクセスと小さなパーシャルのレンダリングの相対的なパフォーマンスを確認するために、いくつかのテストを行う必要がある場合があります。

  3. もう一つの良い点。レールのドキュメントによると、シンボルを渡すと、:touchそれに加えてその属性が更新されますupdated_at-変更をスキップして、のPost#updated_atような列のみを更新する方法があるかもしれませんcomments_updated_at。その後、後者をキャッシュに使用できます。ただし、DB アクセスを回避しようとしている場合は、このタイムスタンプ用にさらに別のキャッシュ キーを保存する必要があります (上記の #1 のように)。

これがあなたにとって苦労する価値があるかどうかを判断する必要があると思います. 2 つの記事では、原則を説明するための単純で不自然な例を示しています。複雑な関連付けを持つアプリでは、「世代別」キャッシュ方式の方が扱いやすい場合があります。

于 2012-10-19T18:25:41.833 に答える
2
  1. はい。しかし、通常、最良のシナリオとかなり良いシナリオが頻繁に出てきます。
  2. はい。私が開発する一部のアプリでは、ビューのレンダリングにクエリの実行の 10 ~ 20 倍の時間がかかります。ベンチマークを見てください。
  3. 投稿のレンダリングにコストがかかる場合は、投稿に触れたくないかもしれませんが、代わりに からコメント リストのキャッシュ キーを作成し[@post.comments.max(:updated_at), @post.comments.size]ます。
于 2012-10-24T11:31:25.667 に答える