問題タブ [russian-doll-caching]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby-on-rails - 行またはテーブルのロックが設定されていない場合、どのようにデッドロックが発生する可能性がありますか? (rails ActiveRecord#touchが原因)
私は Rails 4 のテンプレート キャッシング機能を広範囲に使用しています。多くのネストされたテンプレートとtouch: true
多くのモデル。全体として、これは簡単に推論できる包括的なソリューションであることが証明されています。
私は最近、何百ものオブジェクトを反復処理し、それらに関連する他のオブジェクトを作成する複数のバックグラウンド ジョブが作成される機能を実装しました。これらの各オブジェクトが作成されると、同じユーザーが操作されます。
したがって、これら 2 つのジョブは並行して実行されます。
- ジョブ A: ユーザー 123 に触れるたびに、何百ものオブジェクトを連続して作成します
- ジョブ B: ユーザー 123 に触れるたびに、何百ものオブジェクトを連続して作成します
この機能をデプロイすると、postgres がデッドロックを検出し、互いに待機している 2 つのクエリをキャンセルすることがあることがわかりました。エラーに表示されるクエリは、常にタッチ クエリです (ユーザー 123 の updated_at を現在の時刻で更新します)。
行もテーブルもロックされていないため、このデッドロックが発生することに驚いています。2 番目のトランザクションは、最初のトランザクションが終了するまで待つべきではありませんか?
更新: SQL のみの最小限のバグの再現: https://gist.github.com/jjb/9823023
ruby-on-rails - コレクションのRailsフラグメントキャッシング
特定のページで注文のリストを取得し、それらを表にリストするレール4.1アプリがあります。ログインしているユーザーによってリストが異なることに注意してください。
これのパフォーマンスを向上させるために、注文行ごとにパーシャルをキャッシュすることを検討しています。私は次のようにすることを検討しています:
_order_list.html.erb
_order.html.erb
ただし、コレクション (@orders) のキャッシュについてはよくわかりません。キャッシュされた @orders の同じセットがすべてのユーザーに提供されますか (これは望ましくありません)。
つまり、各ユーザーの @orders のコレクション全体を個別にキャッシュするにはどうすればよいでしょうか?
ruby-on-rails - ビュー フラグメントでのロシア人形のキャッシュと許可ベースのリンク
アイテムのコレクション全体がキャッシュされ、コレクション内の各アイテムがそのキャッシュ内に個別にキャッシュされる、ロシアンドールのキャッシュを利用するビューがあります。
ただし、コレクション内の各アイテムには、CanCan を通じて付与された現在のユーザーのアクセス許可に基づいて、編集/削除のリンクが表示される必要があります。したがって、ユーザー A には、自分の投稿の横にある編集/削除リンクのみが表示され、ユーザー B の投稿の横には表示されません。
ユーザー A が投稿を作成するたびに、適切な編集/削除リンクとともにキャッシュされます。これは、彼女の権限に基づいてそれらを表示する必要があるためです。しかし、ユーザー B がコレクションを表示すると、ユーザー A のキャッシュされた投稿と、表示されるべきではない編集/削除リンクが表示されます。確かに、CanCan はこれらの編集/削除アクションの発生を防ぎますが、リンクは引き続き存在します。
とにかく current_user.id に基づいて個々のキャッシュを作成し、(ほぼ) 同一のキャッシュされたコンテンツのバージョンのゴブを防ぐ方法はありますか?
ruby-on-rails - Rails 4はRedisのIPアドレスへのリンクをリダイレクトします
興味深い問題があります。Rails 4 と Redis でロシア人形のキャッシュ (cache_digests) を使用しています。しばらくすると、ページ上のほとんどのリンクが「domain/url」から「server_ip/url」に変わります。
Redisをフラッシュすると修正されます。
どうすればこの問題を解決できますか?
ruby-on-rails - ロシア人形のキャッシュで何が間違っていますか?
これは私のコードです:
問題は、記事と記事のリンクが最初の記事を除いて表示されないことです。名前だけがレンダリングされます。私のページは次のようになります。
これはひどい著者索引ページです。史上最悪の1つ。
私の名前はYasmeen Connです
私が書いた:いくつかのコメンター
私の名前はケレン・マークスです
私の名前はハッティ・ダーガン博士です
私の名前はレタ・グローバー・シニアです。
私の名前はキーリー・クロッコです
私の名前はミケーレ・レインガーです
私の名前はジョス・パリジャンです
ロシア人形のキャッシュから読んだときに名前だけが表示され、最初の記事「コメント者」だけが表示されます。理由はありますか?
参考までに、著者には多くの記事があり、記事は著者に属します。必要に応じて、他のコードを次に示します。
ruby-on-rails - Rails 4 のさまざまなビューのフラグメント キャッシング
Rails 4 アプリでキャッシングを開始しようとしていますが、キャッシュ キー設定、キャッシュ ヘルパー、および自動有効期限のバージョンが異なるため、少し混乱しています。
では、いくつかの例を挙げて質問させてください。例を意図的に別の質問に移動することはありません。これにより、誰でも一目で微妙な違いを理解できるようになると思います。
1: サイドバーの最新ユーザー
最新のユーザーを表示したい。もちろん、これはアプリ内のすべてのユーザーに同じであり、すべてのページに表示されます。railscastsexpire_fragment...
で、コントローラーを呼び出して期限切れになった同様の例を見ました。ただし、他のリソースによると、これは何かが変更されると自動的に期限切れになるはずです (たとえば、新しいユーザー登録)。私の質問: キーを適切に設定していますか? 自動期限切れになりますか?
_sidebar.html.erb (サイドバーの全ページに表示)
_users_sidebar.html.erb
2: 製品ショーページ
特定の商品を表示したい (ショーページのみ)。これもすべてのユーザーで同じですが、より多くの製品があるため、より多くのバージョンがあります。質問は同じです。キーを適切に設定していますか?また、キーは自動的に期限切れになりますか?
製品/show.html.erb
3: 製品/インデックス (will-paginate gem でページ化)
ここでは、ページネーションの特定のページにあるすべての製品を一度にキャッシュして、製品がブロック単位でキャッシュされるようにします。これもすべてのユーザーに共通で、 にのみ表示されますproducts index page
。(後で、このページの個々の製品に を実装したいと思いrussian-doll-caching
ます。) 私の質問: これは正しく行っていますか? 自動期限切れになりますか?
製品 index.html.erb
_product.html.erb
私が使用しようとしたサンプルコード(それが良いものかどうかはわかりません):
最初は索引ページがあり、ロシア人形はありません。
2 つ目は、コメント付きの番組ページ用のロシア人形です。
ruby-on-rails - rails4 二重入れ子モデル ロシア人形キャッシング
私のrails4アプリには、投稿用に次の構造があります。ユーザーは投稿にコメントでき、コメントに返信を書き込むことができます。ページで自動期限切れキーを使用して russian-doll-caching を使用したいのですが、この場合、どのようにすればよいかわかりません。
この場合の使い方を教えてもらえますか?
モデル:
投稿/index.html.erb
_post.html.erb
_post_comment.html.erb
_post_comment_reply.html.erb
ruby-on-rails - URL のパラメーターに基づいてキャッシュ キーを破棄するにはどうすればよいですか?
私は次のProfile#Index
ようにパーシャルをレンダリングするビューを持っています:
しかし、私app/views/profiles/_profile.html.erb
の には、次のものがあります。
上記が行うことは、結果の下部にラベルを生成することです。これらのラベルはparams
、上記のコードのチェックが有効/真である場合にのみ結果に表示されます。
そのため、ログインしたユーザーが に/
アクセスすると、次のように機能するプロファイルのリストが表示されます。
次に、同じ root_path をトリガーしますが、params を使用すると、(正しく) 次のようになります。
ただし、問題は、ルートページに戻ると、ページのパラメーターのバージョンの結果と、最初の画像と同じ結果になるはずの root_path の通常のバニラの結果を混ぜ合わせて一致させることです。上記(別名、単なるバニラの結果)。
これを修正するにはどうすればよいですか?
編集 1
Austio の提案に従ってparams[:rating]
、部分ビューとコレクション ビューの両方に を追加しました。
だから私のapp/views/profiles/_profile.html.erb
今は次のようになります:
どちらも正しく動作しませんが、上記のコード スニペットを使用したリクエストのログを以下に示します。
これは、正しいキャッシュ ビュー用です。
これは、キャッシュされたビューが正しくない場合です。
それでもうまくいきません。そのログが、この問題の真相を突き止めるのに役立つ何かを示していることを願っています。
編集 2
コレクションと部分キャッシュ キーの両方に追加params[:rating]
しても、まだ root_page で機能しません (正しくないパーシャルが表示されます)。その結果のログは次のとおりです。
ruby-on-rails - ダイジェストは、ロシアの人形のキャッシングの本番環境で計算されますか?
ロシア人形のキャッシングに関していくつかの測定を行いました。
ビューのフラグメントは次のとおりです。
コールド キャッシュを使用すると、ビューは 4.1 秒で生成されます。
キャッシュ時間: 1.500000 1.540000 3.040000 ( 4.105240) ...キャッシュが無効です。So Regenrated... レンダリングされた会議/_meeting_details.html.erb (4108.2ms)
ウォーム キャッシュを使用すると、ログによるとキャッシュは 1.8 ミリ秒で読み取られますが、測定値は 1.4 秒を示しています:
キャッシュ時間: 0.520000 0.640000 1.160000 (1.420288) レンダリングされた会議/_meeting_details.html.erb (1426.6ms)
これは、キャッシュされたビューのロシア人形ダイジェスト ツリーが 1.4 秒で計算されることを意味します。実稼働環境で同じダイジェスト ツリーが計算されますか? そうでない場合、本番環境ではすべてが 1.5 秒で高速になると期待できますか?