memcachedストレージオプションを使用して、アクティブなセッションの数を数える最も簡単で安全な方法を理解しようとしています。 DBベースのセッション記憶域では、テーブル内の行数を数えることができますが、memcachedで同じことをすることはできません。Rails - アクティブなセッションのリスト
おかげで、 ビクラム
memcachedストレージオプションを使用して、アクティブなセッションの数を数える最も簡単で安全な方法を理解しようとしています。 DBベースのセッション記憶域では、テーブル内の行数を数えることができますが、memcachedで同じことをすることはできません。Rails - アクティブなセッションのリスト
おかげで、 ビクラム
は、私はあなたがmemcacheのでそれを行うことができるとは思いません。
私はMemCacheStoreをまだ使用していませんが、データベースのcronジョブとテーブルを持つアプリケーションコントローラのbeforeフィルタを使用して実装している可能性があります。
Memcacheは、使用中のキーを反復処理する方法を明示的に提供していません。特定のキーに基づいて読み書きすることはできますが、ではなく、のすべてのキーのリストを取得したり、繰り返したりできます。これはmemcacheの制限です。
残念ながら、before_filter
は、あなたのアプリに通知されずにセッションがmemcachedで期限切れになる可能性があるため、動作しません。
なぜこの情報を取得しますか?
私はこの投稿が本当に古くなっていることを知っていますが、私はここに潜在的な解決法を追加し、コミュニティからどのようなコメントが来るかを見ていきたいと思いました。
私たちはフラグメントキャッシング(と他のもの)のためにセッションをmemcachedに移動することを検討しています。このアプローチはマシン上で動作していますが、コードをクリーンアップしてより堅牢な環境でテストする機会はありませんでした。
解決策はかなり簡単です。これは、時:分に基づいてキーを使用し、セッションが延長されたときにキーを増減します。セッションが入れられるバケット(キー)が返され、セッションに格納されます。セッションが次回にアプリケーションにヒットしたとき、それが置かれた以前のバケットがcountメソッドに提供されます。セッションはここで(新しいバケットに前のバケットから移動)キー
間を移動することができますこの方法は、メソッドです:
def count(previous_bucket)
# All this does is construct a key like this:
# _session_counter_10:15
key = KEY_PREFIX + time_key(Time.now.hour, Time.now.min)
# do nothing if previous bucket = key
return key if previous_bucket.present? && key.eql?(previous_bucket)
# Increment the count in the cache
Rails.cache.increment(key, 1, expires_in: 30.minutes)
# If there is a previous bucket, decrement the count there
if previous_bucket.present?
Rails.cache.decrement(previous_bucket, 1)
end
# Return the key used so it can be stored in the session which was counted. This will be returned on the next
# call to bump to keep the numbers accurate
return key
end
使用するには、呼び出し元のメソッドは、これをやっている:
counter = SessionCounter.new
session[:counter_bucket] = counter.count(session[:counter_bucket])
指定された期間にセッション数を取得するには、その期間のキーの配列を作成してから、read_multiを使用してその時間のカウントを取得します。例えば
:
keys = ["_session_count_10:15","_session_count_10:14","_session_count_10:13"]
values = Rails.cache.read_multi(*keys)
値は、一致キーを含むことになるハッシュです。キーの値を単純に合計して、その時間内のカウントを取得します。
質問:
更新:
私たちは、このパターンを実装し、生産にそれを入れています。それは私たちのために本当にうまくいっていて、パフォーマンスの問題はまだ現れていません。
こんにちは、回答ありがとうございます。この情報には、ログインしているかどうかに関係なく、サイト上のユーザー数が表示されます。 Vikram –