2016-04-22 6 views
0

У меня есть сотни футбольных игр, сохраненных в моей базе данных redus. Они сохраняются в хешах под ключом: games:soccer:data У меня есть три набора z, чтобы объединить их в предстоящие, живые и закончившиеся. Все заказывается по дате (оценка). Таким образом, я могу легко получить их в зависимости от того, скоро ли они начнутся, они уже происходят, или они уже закончились. Теперь, я хочу, чтобы иметь возможность получить их по именам лиг.Каков наилучший способ получить футбольные игры по именам лиг в redis?

я придумал две альтернативы:

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

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

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

Я ищу скорость и низкое использование памяти.

EDIT (после Hobbs альтернативы):

 const multi = client.multi(); 
     const tempSet = 'users:data:14:sports:soccer:lists:temp_' + getTimestamp(); 

     return multi 
     .sunionstore(
     tempSet, 
     [ 
      'sports:soccer:lists:leagueNames:Bundesliga', 
      'sports:soccer:lists:leagueNames:La Liga' 
     ] 
    ) 
     .zinterstore(
     'users:data:14:sports:soccer:lists:live', 
     2, 
     'sports:lists:live', 
     tempSet 
    ) 
     .del(tempSet) 
     .execAsync() 

Мне нужно установить AGGREGATE MAX на мой вопрос, и я понятия не имею, как это сделать.

ответ

0

Один из способов - использовать SET, содержащий все игры для каждой лиги, и использовать ZINTERSTORE для вычисления пересечения между вашими наборами лиг и вашими существующими наборами. Вы можете делать ZINTERSTORE каждый раз, когда вы запрашиваете данные (это не ужасно дорогостоящая операция, если только ваши данные не очень большие), или вы можете сделать это только при записи в один из «родительских» наборов или вы можете рассматривать это как сортировать кеш, предоставляя ему короткий TTL и создавая его, только если он не существует, когда вы отправляете запрос.

+0

Что произойдет, если этот Узел, содержащий все игры для каждой лиги, станет очень большим с тысячами записей? Имеет ли значение его размер? – ElPirru

+0

@ ElPirru это имеет значение, но тысячи не являются «очень большими» и вряд ли будут проблемой. Но, конечно, создайте некоторые тестовые данные и оцените производительность! – hobbs

+0

Я проведу несколько тестов и опубликую результаты. Я мог бы удалять игры старше х раз, чтобы сохранить размер «маленький» или иметь два SET, один с играми более чем на месяц, а другой список с остальными играми. Что, если я вернусь из лиги игры из своего хэша, а затем сделаю новый набор оттуда? Это будет использовать функцию сортировки, которую я думаю .... – ElPirru