Каков хороший метод для хранения метрики, зависящей от времени, в Redis? - PullRequest
3 голосов
/ 26 июля 2011

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

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

Я подумал, что Redis может подойти. Но я не могу представить себе хорошую стратегию для хранения такой статистики. Единственная идея, которая у меня есть, - хранить независимые счетчики в течение нескольких дней, недель и т. Д. И одновременно обрабатывать их все.

Как ты это делаешь? Мне нужен хороший трюк. Или, может быть, Redis не подходит для моей задачи.

Ответы [ 2 ]

1 голос
/ 29 июля 2011

Если все, что вам нужно, - это подсчет за каждый период, предложенный вами подход с несколькими счетчиками является хорошим. Приращение 5 счетчиков в одной конвейерной транзакции равно O (1), а операции набора - O (log n + m) с потенциально большими значениями n / m.

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

0 голосов
/ 26 июля 2011

Я бы просто использовал отсортированные наборы, где счет - это отметка времени в секундах с начала эпохи (Unix Time). Скажем, у вас есть отсортированный набор логинов, и вы хотите увидеть, сколько логинов произошло в 2010 году, просто конвертируйте 20101231 23:59:59 и 20100101 00:00:00 в секунды и используйте эти аргументы max и min в zcount ,

Очевидно, что сложность здесь заключается в том, чтобы самостоятельно обрабатывать преобразование времени, но на самом деле это очень просто, потому что это стандартный формат Unix. Вы можете использовать команду date с% S (по крайней мере в linux) или использовать системные вызовы time (), localtime () и mktime (), а также любой из множества способов, доступных на определенных языках, построенных поверх эти системные вызовы.

Я уверен, что в Windows есть какая-то эквивалентная парадигма, но у меня нет никакого опыта там.

...