Redis Track Hits - PullRequest
       19

Redis Track Hits

4 голосов
/ 19 октября 2010

У меня на сайте есть простой ежедневный счетчик посещений, для которого я хочу использовать Redis в качестве хранилища данных.

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

Я храню ежедневные обращения по URL.

Как я могу сохранить ежедневные хиты для URL, а затем истечь их в конце дня.

Например:

incr today:www.google.com           >> 1
incr today:www.google.com           >> 2
incr today:www.google.com           >> 3
incr today:www.yahoo.com            >> 1
incr today:www.yahoo.com            >> 2

Как мне истечь эти счетчики в конце дня? Если я делаю expire, он сбрасывает счетчики.

Я чувствую, что мой мыслительный процесс выключен. Я делаю вещи задом наперед?

Ответы [ 4 ]

7 голосов
/ 21 октября 2010

Вы должны использовать текущую дату в качестве ключевого, а не "сегодня".

Установите хэш для текущей даты, где каждый URL является ключом в этом хеше. Ваше обновление будет тогда

HINCRBY 101021 www.google.com 1

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

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

2 голосов
/ 19 ноября 2010

Другой вариант - использовать redis> = 2.1.3. С этой версии expire работает так, как вы хотите. Я использую 2.1.5 (из git), чтобы сделать то же самое. Я использую и expire, и метод, аналогичный тому, что описывает Том. Я помещаю дату в ключ, и я устанавливаю срок действия. С помощью redis> = 2.1.3 вы можете установить значение expire для увеличенной клавиши без сброса счетчика.

Причина обоих заключается в том, что а) я храню больше одного дня и б) если ключи с истекшим сроком действия все еще там по какой-либо причине, я не запрашиваю их при получении статистики за сегодня. Например, hash: SERVER с ключом YEAR: MONTH: DAY: URL увеличивается, и срок действия установлен на сегодня + 3 дня. Работает как шарм.

1 голос
/ 03 декабря 2010

Недавно я выполнил решение для аналитики, встроенной в мое приложение:

incr www.google.com 1

, а затем ночью, в задании cron:

getset www.google.com 0

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

Я также получаю:

lpush yearly:www.google.com <value from getset>
ltrim yearly:www.google.com 0 364 (this is optional)

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

0 голосов
/ 27 апреля 2011

Более простой вариант - использовать текущую дату. Что я делаю, так это использую день месяца месяца в качестве ключа. Но вместо того, чтобы использовать хеш, я упрощаю дело, добавляя страницу к дате в качестве ключа.

Например:

<b>INCR</b> 20110425:www.google.com
<b>INCR</b> 20110424:www.yahoo.com
...
<b>INCR</b> 20110426:www.google.com

Чтобы упростить поиск информации впоследствии, другое решение, которое я использую, где это уместно, - хранить информацию в отсортированном наборе.

Например:

$rank = <b>ZRANK</b> hits:www.google.com 20110425
<b>ZADD</b> hits:www.google.com ($rank + 1) 20110425

С этим вариантом вы можете просто попросить следующее, чтобы получить все хиты для www.google.com:

.
<b>ZRANGE</b> hits:www.google.com 0 -1

или

<b>ZREVRANGE</b> hits:www.google.com 0 -1

или

<b>SORT</b> hits:www.google.com ...

Надеюсь, это какая-то помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...