2010-10-19 4 views
4

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

Просто потому, что у 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 

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

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

+0

К сожалению, все решений я могу думать, что потребуется, по меньшей мере, сценарий и Cron -. Там нет никакого способа узнать, Redis выполнить действие, когда ключ истекает, встроенный в –

ответ

7

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

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

HINCRBY 101021 www.google.com 1

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

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

+0

I подумайте, что вы правильно знаете текущую дату. Это означает, что я могу хранить все данные за каждый день, я также могу делать это в течение месяца и года. – Mark

+0

Кроме того, команда EXPIRE не так велика, как я думал, я мог бы либо просто удалить ключи, когда они устареют, как вы предлагаете. – Mark

2

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

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

1

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

incr www.google.com 1 

затем каждую ночь, в хрон:

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

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

Например:

 
INCR 20110425:www.google.com 
INCR 20110424:www.yahoo.com 
... 
INCR 20110426:www.google.com 

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

Например:

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

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

 
ZRANGE hits:www.google.com 0 -1 

или

 
ZREVRANGE hits:www.google.com 0 -1 

или

 
SORT hits:www.google.com ... 

Надеется, что это некоторая помощь

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

  • Нет связанных вопросов^_^