我想弄清楚使用memcached存儲選項來計算活動會話數的最直接和最安全的方法。使用基於數據庫的會話存儲,我只能計算表中的行數,但不能對memcached執行相同的操作。Rails - 活動會話列表
感謝, 維克拉姆
我想弄清楚使用memcached存儲選項來計算活動會話數的最直接和最安全的方法。使用基於數據庫的會話存儲,我只能計算表中的行數,但不能對memcached執行相同的操作。Rails - 活動會話列表
感謝, 維克拉姆
我不認爲你可以做到這一點與內存緩存。
必須承認我還沒有使用MemCacheStore都,但你也許可以實現使用前和你的數據庫cron作業和表格應用控制器過濾器的東西。
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 – 2009-07-11 22:22:00