2009-07-11 15 views
2

memcachedストレージオプションを使用して、アクティブなセッションの数を数える最も簡単で安全な方法を理解しようとしています。 DBベースのセッション記憶域では、テーブル内の行数を数えることができますが、memcachedで同じことをすることはできません。Rails - アクティブなセッションのリスト

おかげで、 ビクラム

答えて

0

は、私はあなたがmemcacheのでそれを行うことができるとは思いません。

私はMemCacheStoreをまだ使用していませんが、データベースのcronジョブとテーブルを持つアプリケーションコントローラのbeforeフィルタを使用して実装している可能性があります。

1

Memcacheは、使用中のキーを反復処理する方法を明示的に提供していません。特定のキーに基づいて読み書きすることはできますが、ではなく、のすべてのキーのリストを取得したり、繰り返したりできます。これはmemcacheの制限です。

残念ながら、before_filterは、あなたのアプリに通知されずにセッションがmemcachedで期限切れになる可能性があるため、動作しません。

なぜこの情報を取得しますか?

+0

こんにちは、回答ありがとうございます。この情報には、ログインしているかどうかに関係なく、サイト上のユーザー数が表示されます。 Vikram –

0

私はこの投稿が本当に古くなっていることを知っていますが、私はここに潜在的な解決法を追加し、コミュニティからどのようなコメントが来るかを見ていきたいと思いました。

私たちはフラグメントキャッシング(と他のもの)のためにセッションを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) 

値は、一致キーを含むことになるハッシュです。キーの値を単純に合計して、その時間内のカウントを取得します。

質問:

  • ウィルこのスケール?アプリの負荷が大きくなるとキャッシュ内のカウンタを増減するヒットが多く発生します。キーがロックされてアプリのスピードが落ちるのですか?増分/減分セクションをスレッドに入れることを考えましたが、既知の問題が発生するまでパフォーマンスを調整しないでください。

更新:

私たちは、このパターンを実装し、生産にそれを入れています。それは私たちのために本当にうまくいっていて、パフォーマンスの問題はまだ現れていません。

関連する問題