ログイン ユーザーと匿名ユーザーの両方がいる 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 をクライアントとして使用しています。