2009-07-11 91 views
2

我想弄清楚使用memcached存儲選項來計算活動會話數的最直接和最安全的方法。使用基於數據庫的會話存儲,我只能計算表中的行數,但不能對memcached執行相同的操作。Rails - 活動會話列表

感謝, 維克拉姆

回答

0

我不認爲你可以做到這一點與內存緩存。

必須承認我還沒有使用MemCacheStore都,但你也許可以實現使用前和你的數據庫cron作業和表格應用控制器過濾器的東西。

1

Memcache中明確不提供一種方式來遍歷所使用的密鑰。您可以基於特定密鑰進行讀取或寫入,但您可以通過而不是獲取所有密鑰的列表或對其進行迭代。這是memcache的限制。

不幸的是,before_filter不會工作,因爲會話可以在memcached中沒有您的應用程序將到期被通知這件事。

爲什麼你想要得到這些信息?

+0

嗨,謝謝你的回答。我希望這些信息能夠顯示網站上的用戶數量,無論是登錄還是其他。 Vikram – 2009-07-11 22:22:00

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) 

值是其中將包含任何匹配的密鑰的散列。簡單地總結一下這些時間段內的鍵值。

問:

  • 請問這樣的規模?當應用程序處於高負載狀態時,會有很多命中遞增/遞減緩存中的計數器。密鑰鎖上會導致應用程序減速嗎?我想過把遞增/遞減部分放到一個線程中,但是你知道,直到有一個已知問題時纔會調整性能。

更新:

我們已經實現了這個模式,並投入生產。它一直在爲我們工作得很好,而且還沒有出現性能問題。