Перейти к контенту

Как мы ломали

  • записи
    24
  • комментариев
    147
  • просмотра
    16 233

Считаем пользователей онлайн


MiksIr

177 просмотров

Наткнулся тут на одно красивое решение подсчета онлайн пользователей в мемкеше. Пишу.. ну, во многом, что бы самому не забыть.

Итак, есть проблема - нужно считать уникальные сессии, которые были на сайте на последние 5 минут. Не, конечно, можно все это держать в каком-нить массиве, который постоянно гонять туда-сюда между скриптом и мемкешом, но это совершенно работать не будет, ибо объем данных большой (гонять долго... ну пользователей у нас очень много, ясно дело, иначе зачем вообще тогда заморачиваться) и самое главное - пойдут коллизии. А вводить еще и блокировки, типа "я взял, ждите, пока верну" - это "до свидания" производительности.

Решение услышал на последнем хайлоаде... понравилось.

Итак, вводные условия - посещение за последние 5 (X) минут, обновлять инфу каждую 1 (Y) минуту. Создаем 6 ключей (X/Y+1) и еще один ключ как указатель на один из тех 6.

[1][2][3][4][5][6]

^

|

Приходит сессия, проверяем ее уникальность. Если сессия не уникальная, тому ключу, на который указывает указатель говорим инкримент. Каждую минуту сдвигаем указатель на следующий ключ. Каждому ключу при инициализации говорим время жизни - 5 минут, т.е. когда указатель сдвигается на следующий ключ, данные в нем как раз помирают и в нем счетчик начинает работать с нуля.

Видно, что во всех блоках (кроме текущего) хранится количество уникальных сессий, причем те уникальные сессии, которые были насчитаны более 5 минут назад - отмерли. Текущий ключ мы суммировать с другими не можем, ибо тогда у нас счетчик будет прыгать туда-сюда.

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

Если нужна большая интерактивность, можно увеличивать кол-во блоков и повышать частоту обновления.

Сейчас на основе этой идеи есть мысли, как хранить и имена пользователей (что бы получать не только число, но и список) с минимальными патчами мемкеша, но реализовывать в ближайшее время их не будем ;)

0 комментариев


Рекомендуемые комментарии

Комментариев для отображения не найдено.

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.