Кассандра рекорд - PullRequest
       12

Кассандра рекорд

1 голос
/ 12 марта 2012

Если я хочу, чтобы у меня были только запросы для:

1. Username, Xp, OtherUserData
2. User with the N-th highest Xp

Как бы мне пришлось выполнять структуру данных и запрос.

Для 1. У меня была бы структура, аналогичная: {Имя пользователя: {Xp, OtherUserData}}

Должен ли я просто сделать запрос для 2. для всех пользователей или есть лучший вариант?

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Я не совсем уверен, что вы спрашиваете (Xp оценка пользователя?), Но вот предположение:

Чтобы сохранить пользовательские данные, создайте строку для пользователя, введя его имя пользователя (при условии, чтоэто уникально и исправлено), а затем столбец для каждого элемента:

username ->  Xp      other    ...
             value   value    ...

Чтобы вести таблицу рекордов, используйте одну строку (возможно, в другом семействе столбцов) со всеми пользователями (иливыше определенного порога), с именами столбцов, которые являются баллами, и укажите числовой (LongType) компаратор, чтобы столбцы сортировались по баллам:

highscores -> 1000      1001      99999999   ...
              user123   user345   user789    ...

Затем можно получить самые высокие N баллов позапрос последнего или первого N столбцов в этой отсортированной строке.Вы можете удалить низкие оценки из этой строки, если она станет слишком большой.

Обновление : Как вы указали, несколько пользователей могут иметь одинаковые оценки.Быстрое и грязное решение состояло бы в том, чтобы сделать значение списком пользователей:

highscores -> 1000      
              "user123, user567, user899"

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

Вы можете использовать суперколонки, хотя обычно это не рекомендуется.

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

1 голос
/ 09 августа 2012

Использование только одного ряда для классификации может быть довольно опасным, поскольку каждый ряд размещается только на одном экземпляре Cassandra. Таким образом, все игроки в вашей системе будут писать на этот ОДИН ключ - на одной машине - с риском перегрузки узла в вашем кластере. Это может привести к сбою всего кластера из-за странной цепной реакции узлов, пытающихся взять на себя нагрузку сбитого узла, когда он пытается восстановиться (это происходило на наших производственных машинах из-за ошибки, в которой был жестко закодированный тест). ключ получит все записи, которые должны были быть в отдельных строках для всех).

Решением было бы объединение ваших пользователей по их оценкам:

  • 0-> 1000 = ковшА
  • 1001 -> 5000 = ковш B
  • 5001 -> 15000 = bucketC и т. д.

Я бы посоветовал уменьшить ведра нижнего уровня.

И напишите свой столбец с именами столбцов как составной: CompositeType (LongType, UTF8Type)

так, например, если вы используете UUID в качестве идентификатора игрока и longs в качестве счета, у нас будет:

  • 500089845: f7bc41d8-c1c6-489c-bb2c-f86fccc7681c
  • 4100085589: 2ae91e9f-1512-4ef8-8441-9f48e21fb11b

вы можете сделать это с конкатенацией строк, но вам нужно будет записать все ведущие нули, чтобы компаратор UTF8 сравнивал все оценки в правильном порядке.

  1. 000000500089845: f7bc41d8-c1c6-489c-bb2c-f86fccc7681c
  2. 000004100085589: 2ae91e9f-1512-4ef8-8441-9f48e21fb11b

без начальных нулей будет

  1. 000004100085589: 2ae91e9f-1512-4ef8-8441-9f48e21fb11b
  2. 000000500089845: f7bc41d8-c1c6-489c-bb2c-f86fccc7681c

Таким образом, вам не нужно читать, чтобы изменить вектор, json, составной столбец или суперколонку людей, имеющих одинаковые оценки, поскольку каждый счет представляет собой отдельный столбец. Вы можете поместить любую нужную информацию в столбец, чтобы можно было получить все за одно чтение (без необходимости извлекать информацию об игроке с другим чтением, лично я сделал бы это с сериализованным объектом json или byte, который содержит все, что мне нужно) .

Чтобы прочитать: запрос с инвертированным диапазоном (самый высокий сначала) в строках, которые вы хотите, добьется цели.

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

надеюсь, что это было полезно

...