2009-07-11 5 views
2

Я пытаюсь выяснить наиболее простой и безопасный способ подсчета количества активных сеансов с использованием опции memcached storage. С хранилищем сеансов на основе БД я могу просто подсчитать количество строк в таблице, но не могу сделать то же самое с memcached.Rails - Список активных сеансов

Спасибо, Викрам

ответ

0

Я не думаю, что вы можете сделать это с помощью кэша памяти.

Должен признаться, что я еще не использовал MemCacheStore, но вы, вероятно, могли бы реализовать что-то, используя до фильтров в контроллере приложения с заданием cron и таблицей в вашей базе данных.

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) 

значения хэш, который будет содержать какие-либо клавиши соответствия. Просто суммируйте значения ключей, чтобы получить счет в этот период времени.

Вопрос:

  • Будет ли эта шкала? В кэше будет много инкрементов/уменьшающихся счетчиков, когда приложение находится под большой нагрузкой. Будут ли блокировки на ключе, заставляющие приложение замедляться? Я думал о том, чтобы включить секцию increment/decment в поток, но вы знаете, не настраивайте производительность до тех пор, пока не появится известная проблема.

Update:

Мы реализовали этот шаблон и поместить его в производство. Он работает очень хорошо для нас, и никаких проблем с производительностью пока не появилось.

Смежные вопросы