Я пытаюсь настроить систему, в которой ВСЕ ссылки, опубликованные пользователями и нажатые их подписчиками, хранятся в Redis таким образом, чтобы выполнялись следующие требования:
Возможность получить (например, 10%) большинство кликов по ссылкам за определенный период времени (может быть либо сегодня, на этой неделе, либо за все время, либо на заказ).
Возможность запрашивать всех пользователей, которые разместили одну и ту же ссылку.
Поскольку мы уже использовали много ключей, в идеале мы храним все это в одном ключе Redis.
Может кодировать значение в JSON, если необходимо.
Вот что я до сих пор придумал:
-Я использую один Redis Hash, каждый из которых равен одному часу, так что за один день этот хэш будет содержать 24 поля.
-В каждом поле я храню JSON, закодированный из массива в формате:
array("timestamp1" => array($url1, $url2, ...)
, "timestamp2" => array($url3, $url4, ...)
, ..., ...);
- Полная структура этого хэша:
[01/01/2010 00:00] => JSON(...),
[01/01/2010 01:00] => JSON(...),
....
Таким образом, я могу получить все клики по любому URL за любой период времени.
Однако я не могу использовать этот хэш для получения всех пользователей, разместивших URL.
Вопрос: есть ли лучший способ сделать это?
Обновлено 07/30/2011 : в настоящее время я храню минуты, часы, дни, недели, месяцы и годы в одном хеше.
Итак, один щелчок сохраняется во многих полях одновременно:
- в поле для минуты (формат YmdHi)
- в поле для часа (формат YmdH)
- в поле для дня (формат Ymd)
- в поле на неделю (формат YW)
- в поле за месяц (формат Ym)
- в поле для года (формат Y).
Таким образом, пытаясь получить конкретный таймфрейм, я мог получить доступ только к необходимым полям, не переключаясь по часам.
Например, если мне нужны клики с 26.07.2011 с 20:00 до 28.07.2011 в 02:00, мне нужно запросить только 7 полей: 1 поле для полного дня 27.07.2011, 4 поля для часов с 20:00 до 23:00 26.07, а затем еще 2 поля для часов с 00:00 до 01:00 07/28