2014-06-26 65 views

回答

3

可能最好的解決方案是切換到使用Active Record Session存儲。這很容易做到 - 您只需添加(並運行)遷移即可創建會話表。只要運行:

rake db:sessions:create 

那麼會話存儲配置添加到:config/initializers/session_store.rb像這樣:

YourApplication::Application.config.session_store :active_record_store 

一旦你做到了這一點,並重新啓動您的服務器的Rails現在將在數據庫中存儲您的會話。

這樣你就可以得到在使用類似的用戶登錄的當前數量:

ActiveRecord::SessionStore::Session.count 

雖然會更準確只計算那些最近更新 - 說的最後5分鐘:

ActiveRecord::SessionStore::Session.where("updated_at > ?", 5.minutes.ago).count 

根據您需要多長時間查詢你可能要考慮的緩存值或遞增/在後創建或滅絕之後,回調遞減緩存值,但似乎有點小題大做此值。

+0

感謝您的回答。這種方法對PostgreSQL的高負載應用程序有效嗎?沒有額外的查詢找到解決方案將是很酷的。 – user1538633

+0

我會先嚐試這種技術,這是一個簡單的查詢,遷移自動將一個索引添加到updated_at列。如果您發現導致性能問題,您可以考慮使用類似的方法,但是可以使用mem_cache_store,也可以簡單地緩存數據庫查詢的結果。 – stuartbates

0

當一個會話被創建或銷燬時,你可以嘗試實現一個增量或減量的會話變量,並使用一些助手來遞增/遞減計數器。

def sessions_increment 
    if session[:count].nil? 
    session[:count] = 0 
    end 
    session[:count] += 1 
end 
def sessions_decrement 
    if session[:count].nil? 
    session[:count] = 0 
    end 
    session[:count] -= 1 
end 
相關問題