2013-03-08 2 views
0

Я ищу для хранения следующей группы информации. Я сохраняю минутную метку времени (например, группу всех идентификаторов браузера, видимых в окне за 1 минуту), а затем список ссылок на браузер. Я хотел бы иметь только один экземпляр идентификатора браузераОптимальная структура хранения в Redis

Какую структуру данных в Redis можно использовать для этой структуры данных? Есть ли более оптимальный способ его хранения?

... 
12:06 -> browser1, browser7 
12:07 -> browser8 
12:08 -> browser4, browser5, browser6, browser9 
... 

В каждой строке может проживать около 1 дня.

При добавлении нового идентификатора браузера я сначала проверяю, существует ли идентификатор браузера где-то в данных, если он удаляет и добавляет в новую минутную строку.

Наконец-то каждые 1 минуту я беру строку с 30 минут назад и обрабатываю эти идентификаторы браузера, а затем удаляю эту строку из списка при полной обработке.

В этой структуре данных может быть до 1 миллиона рефералов браузера.

ответ

1

Ok, новой информации, новый ответ :)

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

При добавлении нового браузера;

  1. Проверьте, присутствует ли он в системе, проверяя, существует ли его ключ.
  2. Если это так, проверьте, к какой отметке времени он относится, удалите его из старой метки времени, добавьте его в новую. Обновите ключ браузера.
  3. Если нет, добавьте его к отметке времени и установите ключ браузера.

истечь ключи я, вероятно, не использовать встроенный в истекают, а не использовать хрон работу или что-то

  1. Удалить все ключи браузера в метку времени
  2. Удалить ключ временной метки.

Пример структуры данных;

ts:12:01 -> {1, 3} 
ts:12:02 -> {2} 

browser:1 -> 12:01 
browser:2 -> 12:02 
browser:3 -> 12:01 

Это должно быть разумно O (1), но с немного более высоким постоянным временем (несколько запросов для каждой операции). Возможно, это можно уменьшить, используя скрипты на стороне сервера.

Надеюсь, что это поможет!

0

Список достаточно. Фактически, если число браузеров меньше 400 (согласно вашему файлу conf, но по умолчанию 400), Redis реализует последовательный массив для списка подстановок для экономии пространства.

Подробнее читайте: https://github.com/antirez/redis/blob/unstable/src/ziplist.h

+0

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

+1

Я думаю, что вы должны хранить все браузеры с помощью хеш-таблицы для ускорения запроса, потому что ваш браузер слишком велик. O (1) отлично. – kaitian521

+0

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

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