Я знаю, что это сообщение действительно старое, но я думал, что добавлю потенциальное решение здесь и посмотрю, какие комментарии приходят из сообщества.
Мы планируем перенести наши сеансы на 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)
значения хэш, который будет содержать какие-либо клавиши соответствия. Просто суммируйте значения ключей, чтобы получить счет в этот период времени.
Вопрос:
- Будет ли эта шкала? В кэше будет много инкрементов/уменьшающихся счетчиков, когда приложение находится под большой нагрузкой. Будут ли блокировки на ключе, заставляющие приложение замедляться? Я думал о том, чтобы включить секцию increment/decment в поток, но вы знаете, не настраивайте производительность до тех пор, пока не появится известная проблема.
Update:
Мы реализовали этот шаблон и поместить его в производство. Он работает очень хорошо для нас, и никаких проблем с производительностью пока не появилось.
Привет, спасибо за ответ. Я хочу, чтобы эта информация отображала количество пользователей на сайте, независимо от того, зарегистрировался он или нет. Vikram –