Динамическая сортировка с Redis - PullRequest
0 голосов
/ 21 декабря 2011

Допустим, у меня 5 записей в базе данных Redis:

  • news::id: идентификатор последней новости;
  • news::list: список всех идентификаторов новостей;
  • news:n, где n - идентификатор новости: хэш, содержащий такие поля, как title, url и т. Д .;
  • news:n:upvotes:список идентификаторов всех пользователей, которые проголосовали за новости, таким образом, указав количество голосов против.
  • news:n:downvotes: список идентификаторов всех пользователей, проголосовавших против новостей, таким образом, указав количество голосов против.

Тогда у меня есть несколько алгоритмов ранжирования, где rank =:

  1. upvotes_count;
  2. upvotes_count - downvotes_count;
  3. upvotes_count - downvotes_count - age;
  4. upvotes_count / downvotes_count;
  5. age.

Теперь, как мне отсортировать эти новости по каждому из этих алгоритмов?

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

EVAL может помочь, ноэто не будет доступно до v2.6, что, конечно, я нехочу подождать.

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

Так есть ли правильный способ сделать это или я должен просто перейти на MongoDB?

1 Ответ

0 голосов
/ 21 декабря 2011

Вы можете сортировать по константам, хранящимся в ключах.

В вашем примере я могу сортировать 1. почти тривиально, используя Redis.Если вы сохраните значения других выражений после их вычисления, вы также можете отсортировать их.Для 1. вам нужно где-то хранить счетчик списков, я буду считать news:n:upvotes:count.

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

SORT news::list BY news:*:upvotes:count GET news:*->title GET news:*->url

... для получения заголовков и URL-адресов, отсортированных по количеству голосов в порядке возрастания.

Существуют также модификаторы для сортировки alphaи asc/desc сортировка.Полностью прочитайте командную страницу, это того стоит.

PS: Вы можете обернуть счет, сохранить, отсортировать и, возможно, удалить счет в среде MULTI / EXEC (транзакция).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...