Счетчик страниц Redis

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

redis.set("date:YYYYMMDD:site:sitename", 1)

Я хочу иметь возможность запрашивать по дате или по имени сайта и отображать значение счетчика. Я пытался использовать .keys для запросов по дате или имени сайта, но в документации REDIS сказано, что ключи использовать не следует.
Тогда я подумал, что, может быть, можно использовать хэши redis:

redis.hset("date:YYYYMMDD", "site", "sitename")
redis.hset("counter", 1)

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

Любые предложения будут ценны! Я раньше не использовал REDIS.


person Ptrkcon    schedule 03.11.2013    source источник


Ответы (2)


Для общих увеличивающихся счетчиков, таких как описано, структура по строкам этот ответ будет проверенным способом сделать это. Приведенный ответ содержит более подробную информацию об использовании отсортированных наборов для данных временных рядов, таких как этот. У него даже есть методы для объединения данных (возможно, вы также хотите отчитаться о ежемесячных данных).

Если, как показывают ваши примеры, ваше разрешение ежедневно, то структура, которая хранит данные в отсортированном наборе с именем сайта/домена в ключе и использует дневную отметку времени и [ZINCRBY][2], будет вам полезна.

Что касается keys... не надо. Просто не надо.

В качестве альтернативы вы устанавливаете сохранение ключей при использовании доменов/имен сайтов в качестве идентификатора. Всякий раз, когда вы запускаете ZINCRBY для имени сайта/домена, также выполняйте операцию SADD для «индексного ключа», такого как sites-with-traffic:YYYY:MM:DD. Таким образом, вы можете получить набор уникальных сайтов за этот день и построить свои запросы для каждого из них.

В вашем описании вы говорите, что, возможно, захотите сообщить в определенные дни. Способ сделать это с помощью Redis — просто запросить ключевые данные, которые были бы, если бы они были там. Если вы ничего не вернете, трафик за этот период равен 0. Не запрашивайте, когда у вас есть набор параметров - используйте их. Единственным из перечисленных вами шаблонов запросов, который, возможно, будет неизвестен, будет вышеупомянутое имя сайта/домена, и добавление их в набор решает эту проблему.

person The Real Bill    schedule 01.03.2014

Для подсчета вы можете использовать команду incr/decr

http://redis.io/commands/incr

Когда вы получаете доступ, увеличивайте счетчик следующим образом:

  > incr counter:site2:20131101
  (integer) 1
  > incr counter:site1:20131103
  (integer) 1
  > incr counter:site1:20131103
  (integer) 2
  > incr counter:site2:20131103
  (integer) 1

Когда вы запрашиваете счетчики, сначала получите все ключи, а затем суммируйте все счетчики в своем приложении.

  > keys counter:site2:* # query by site
  1) "counter:site2:20131101"
  2) "counter:site2:20131103"
  > get "counter:site2:20131101"
  "1"
  > get "counter:site2:20131103"
  "1"
  > keys counter:*:20131103 # query by date
  1) "counter:site1:20131103"
  2) "counter:site2:20131103"
  ...
person quiver    schedule 03.11.2013
comment
Эй, Куивер, спасибо за ответ! Меня беспокоил отказ от ответственности на странице Redis об использовании KEYS в производственной среде. redis.io/commands/keys. Я не уверен, есть ли другой метод, который я должен использовать вместо KEYS. Есть ли какая-либо польза от именования счетчика набора:... ? - person Ptrkcon; 03.11.2013
comment
Я не пробовал keys для больших наборов данных, поэтому не знаю, насколько хорошо он масштабируется. Кроме того, итерируемая операция находится в разработке, но не перенесена в стабильную версию. antirez.com/news/63 Это может упростить подсчет в будущем. Redis лучше всего подходит для операций ключ-значение. Если вам нужен точный контроль над отчетами, вам следует хранить наборы данных в других базах данных, на мой взгляд. - person quiver; 04.11.2013
comment
Спасибо за эту ссылку. Я буду следить за этой функцией, она определенно облегчит задачу. Что касается отчетности, я просто хотел бы запросить по дате, диапазону дат и имени сайта. Я думаю, что все это можно сделать в настоящее время с ключами. - person Ptrkcon; 04.11.2013