2013-04-18 2 views
20

Я работаю над распределенной базой данных. Я пытаюсь создать уникальный идентификатор, который будет служить в качестве первичного ключа семейства столбцов в .Кассандра: Создайте уникальный идентификатор?

Я прочитал некоторые статьи об этом с помощью Java, используя UUID, но похоже, что вероятность столкновения (даже если она очень низкая).

Интересно, есть ли способ генерировать уникальный идентификатор, основанный на времени, может быть?

ответ

23

Вы можете использовать тип TimeUUID в Кассандре, который поддерживает Тип 1 UUID. Это использует текущее время и MAC-адрес создателя и порядковый номер. Если номер TimeUUID сгенерирован правильно, это можно сделать с нулевыми коллизиями (вы можете использовать CQL now()method или вставить свой собственный, SDK Java предоставляют некоторые поточно-безопасные реализации). Основным преимуществом TimeUUIDs является то, что идентификаторы могут быть упорядочены по времени. См. http://wiki.apache.org/cassandra/TimeBaseUUIDNotes для получения дополнительной информации.

Однако порядок времени вряд ли будет полезен для первичных ключей строк, поскольку порядок использования бесполезен при использовании хэш-разделителя, хотя возможно с использованием clustering key. А также сложность генерации уникального идентификатора может быть источником ошибок, если вы откажетесь от своего собственного. Кассандра также поддерживает Тип 4 UUID с использованием типа UUID. Это просто случайные биты. Существует вероятность столкновения, но вероятность столкновения (если предположить, что некоррелированные источники случайных чисел, которые будут, если вы создадите на Java), крайне низки - если вы создали 1 миллиард в секунду в течение 100 лет, вероятность одного столкновения составляет около 50% , (См. http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates для получения более подробной информации.)

+0

Спасибо за ваш ответ. Если я использую UUID типа 1, например: CREATE TABLE timeline (rid uuid, PRIMARY KEY (rid)) Как бы сгенерировать удаление и вставить его в CF? (Я прочитал о методе, называемом now() в Cassandra, но я не знаю, как его использовать) – user2090879

+2

Вы должны использовать тип timeuuid, если используете UUID типа 1. Это должно работать: CREATE TABLE timeline (избавить timeuuid, PRIMARY KEY (rid)); Вставить в значения временной шкалы (rid) (now()); – Richard

+0

У меня эта ошибка: отсутствует EOF at ')'. это похоже, что он не распознает метод now(). ps: Я использую Cassandra 1.2.0 – user2090879

2

Вы должны изучить с помощью Twitter Snowflake. Из проекта риого:

As we at Twitter move away from Mysql towards Cassandra, we've needed a new way to generate id numbers. There is no sequential id generation facility in Cassandra, nor should there be.

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

+0

Большое вам спасибо! – user2090879

5

Как сказал Ричард, вы можете использовать TimeUUID, и генерация значения TimeUUID не имеет большого значения. Просто выполните cassandra FAQ timeuuid.

+0

спасибо за помощь :) – user2090879

2

Вам необходимо использовать функцию cassandra now(), чтобы генерировать timeuuid и использовать функцию uuid() для генерации строки типа uuid.

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