2

ログイン ユーザーと匿名ユーザーの両方がいる Rails 3 サイトにフラグメント キャッシュを追加する作業を行っており、サイト全体に表示されるコンテンツがいつ更新されるかに基づいて、ページの一部が期限切れになるタイミングを制御する必要があります。これの途中で、memcached が expire_fragment の正規表現をサポートしていないことがわかったので、これを回避する方法を探しています。

匿名ユーザーにとって、これは大きな問題ではありません。「frontpage-new-shows」や「schedule-weekly-forecast-10/24/10」などのキャッシュ キーを作成し、ショー モデルに新しいエントリが作成されたとき、または次の週に放映されるショーのときに期限切れにしますスイーパーによって変更されます。それはうまくいきます。

私の問題は、ログインしているユーザーにあります。それぞれが独自のカスタマイズされたスケジュールを持っているため、キーは 'schedule-user-jschuur-10/10/24' のようになり、jschuur がアカウントのユーザー名になります。日付ベースの規則では、それらは自然に期限切れになることを理解していますが、その日 (または週) のスケジュールでショー関連の変更が発生した日中に、キャッシュされたスケジュールのすべてのフラグメントを明示的に期限切れにしたいと考えています。

結局のところ、memcached は、ここで必要なワイルドカードの有効期限 (schedule-user-.*-10/10/24) を行うことができません。これは、発行されたすべてのキーを memcached の中央検索キーに格納する何らかのソリューションが必要であることを意味します。または、memcached に送信したキーに基づいて Rails/Ruby に何らかの方法でこれを内部的に実行させる必要があります。

私は前者がより良い解決策であると仮定しています。私の質問は、これを最も効率的な方法で行うにはどうすればよいかということです。そのため、DB にヒットすることなく節約された時間を常に吹き飛ばすことはありません。配列またはハッシュをmemcachedに保存し、全体を取得し、一致する場合はループオーバーし、それらを削除してハッシュを保存するだけです。これは、数百人または数千人のユーザーにとってはうまく機能するように思えますが、これが本当に最善の方法でしょうか?

誰かがすでにこの問題に取り組み、解決策をリリースしていますか?

考慮すべきことの 1 つは、私のキャッシングのほとんどすべてが、現在、次のように、まだ起動されていない ActiveRelations で準備されたクエリを対象とした、ビュー内のステートメントで行われていることです。

<% if current_user %>
  <% if current_user.saved_shows_count %>
    <% cache "schedule-user-#{current_user.username}-#{(Time.now + 3.hours).to_date.end_of_week.strftime('%D')}" do %>
      <% if @shows.any? %>
        <%= render :partial => "schedule/schedule", :locals => { :shows => @shows } %>
      <% end %>
    <% end %>
...

このサイトは Heroku でホストされており、dalli gem をクライアントとして使用しています。

4

1 に答える 1

5

EDIT: dalli gemで書かれたように、これにはいくつかの問題があります。読み取りを行うと、「マーシャルデータが短すぎます」または「memcacheでマーシャルされたデータが無効です」が発生します。それがあなたにも当てはまるかどうかはわかりません。

少しハックですが、名前空間を使用してから名前空間を増やして、それを使用して作成されたすべてのキーを無効にすることができます。これを行うには、最初に名前空間をイニシャライザ (または任意の場所) で設定しますRails.cache.write("frontpage-new-shows-namespace", "1", {:raw => true})。各キャッシュを設定するときRails.cache.read("frontpage-new-shows-namespace")は、好きな場所にハッシュ キーを追加します (場所はどこでもかまいません)。名前空間で作成されたすべてのキャッシュ キーを期限切れにするのは簡単Rails.cache.increment("frontpage-new-shows-namespace", 1)です。グローバル変数として追加Rails.cache.read("frontpage-new-shows-namespace")して、キャッシュ キーを作成するための memcache 検索を排除し、キャッシュ名前空間のインクリメントを行うたびにこの変数を更新できる場合があります。

頑張ってください。これがお役に立てば幸いです。

于 2010-10-25T17:16:18.367 に答える