«Уникальный идентификатор» — это очень распространенное требование в приложениях, оно используется для уникальной идентификации бизнес-объекта, ресурса, сообщения и т. д. В базе данных уникальный идентификатор обычно используется в качестве первичного ключа данных. Друзья, прочитавшие предыдущую статью о принципе индексации MySQL, должны знать, что важность первичного ключа для базы данных очевидна.
В автономном сценарии очень легко получить глобально уникальный идентификатор, вы можете использовать базу данныхфункция автоматического увеличения.
Но если вы хотите создать глобально уникальный идентификатор в распределенном сценарии, все немного по-другому. Поскольку распределенные системы обычноВысокий параллелизмСцена, естественным образом не подходит для использования самообумеренной функции автономной базы данных. Если ваш технический выбор оказывается «неразделенной базой данных», как MySQL, вы должны обратиться к обычному распределенному глобальному уникальному стратегии генерации ID.
UUID
Полное название UUID — Universally Unique Identifier, что переводится как Универсальный Уникальный Идентификатор. Стандартная форма содержит 32 шестнадцатеричных цифры, разделенных на пять сегментов дефисами, и 36 символов в виде 8-4-4-4-12, например:9628f6e9-70ca-45aa-9f7c-77afe0d26e05
, на данный момент в отрасли существует 5 способов создания UUID.Подробности см. в спецификации UUID «Пространство имен URN универсального уникального идентификатора (UUID)», выпущенной IETF, которая называется 5 версиями UUID.
Поставляется с JDKUUID
Классы могут генерировать UUID версии 3 и версии 4. Итак, вот краткое введение в то, как генерируются UUID версии 3 и версии 4.
- UUID версии 3: получен путем вычисления хэша MD5 имени и пространства имен.
- Версия 4 UUID: UUID сгенерировал случайное число или псевдослучайное число. Вероятность этого UUID сгенерированного дубликата может быть рассчитана, но потенциал для дублирования незначительно, поэтому эта версия также часто используется версия.
Существуют также веб-сайты, которые генерируют UUID онлайн.Если UUID используются в вашем проекте, их можно использовать для создания временных тестовых данных.www.uuidgenerator.net/
Преимущество UUID в том, чтоЭто просто реализовать, вы можете получить его с помощью собственного API JDK. Недостатком является то, что он не соответствует стратегии индексации первичного ключа базы данных, основанной на механизме b-дерева, и не подходит в качестве первичного ключа базы данных в высокопроизводительных сценариях.
Реализация на основе Redis
Все они распределены, и большинство из них нужно кэшировать. Для кэширования можно использовать Redis. РедисINCR
Функции — это атомарные операции на одной машине, гарантированно уникальные и инкрементальные.
单机Redis可能无法支撑高并发。而如果使用Redis集群,如何保证ID的唯一性呢? можно использоватьразмер шагаПуть. Например, в кластере, состоящем из 5 узлов Redis, их сгенерированные идентификаторы:
A: 1,6,11,16,21
B: 2,7,12,17,22
C: 3,8,13,18,23
D: 4,9,14,19,24
E: 5,10,15,20,25
Классная программа «Снежинка»
TwitterИспользование Zookeeper для реализации службы генерации глобальных идентификаторовsnowflake. Структура данных сгенерированного идентификатора показана на следующем рисунке:
Всего 64 бита, что точно соответствует стандарту Java.long
型,第一个符号位不用,然后41位用于表示时间戳。 Subsequent 10 bits used to represent the ID of the node, if it is a multi-machine room node, you can divide the first 5 bits to indicate the machine room ID, the 5 bits used to represent the ID of the machine under each computer номер.最后12位用来表示序列号,这样可以做到同一毫秒,同一机器生成多个id,12位算下来最多支持4096个。
Временная метка здесь — это не метка времени текущего времени, а разница между текущим временем и временем начала. 41 бит длится около 69 лет, если считать в миллисекундах.
Существует множество вариантов алгоритма снежинки. Вы можете настроить распределение битов в соответствии с вашей реальной ситуацией, например, временная метка занимает 42 бита, а идентификатор машины — 9 бит. 42-битная временная метка может использовать 138 лет и т. д.
UidGenerator от Baidu и Leaf от Meituan — это варианты на основе снежинок.
Snowflake — это лучший способ создания идентификаторов, который обеспечивает глобальную уникальность и поддерживает высокий уровень параллелизма. И являетсяlong
Тип, тенденция к увеличению, может использоваться для первичного ключа базы данных. Вы также можете сортировать по времени.
Но и у него есть свои недостаткиСильные сервер-зависимые часы, если часы сервера вернутся назад (например, дополнительная секунда или синхронизация NTP), это приведет к дублированию идентификатора.
Meituan's Leaf решает проблему обратного вызова часов Конкретный процесс выглядит следующим образом:
другие методы
Конечно, есть и другие схемы генерации ID, такие как:
-
Диди: время + номер стартовой точки + номерной знак
-
Порядок Taobao: временная метка + идентификатор пользователя
-
Другая электронная коммерция: Timestamp + Channel Channel + ID пользователя, а некоторые добавят идентификатор первого элемента в порядке.
-
Идентификатор MongoDB: это также тип снежинки. Через «время + машинный код + pid + inc» всего 12 байтов, 4 + 3 + 2 + 3, наконец, идентифицируется как шестнадцатеричный символ длиной 24.
Суммировать
если не используется дляпервичный ключ базы данных, рекомендуется использовать UUID напрямую.
Если вы хотите использовать его в качестве первичного ключа базы данных и не используете распределенную базу данных (например, TiDB, MongoDB и т. д.), вы можете рассмотреть возможность использования алгоритма снежинки.Рекомендуется использовать Meituan's Leaf.
Распределенный идентификатор Sharding Matherware Sharding-JDBC принимает алгоритм снежинки, открытый в Twitter, и не нужно полагаться на любые сторонние компоненты, так что его масштабируемость и обслуживание значительно упрощены; однако дефекты алгоритма снежинки (Сильная зависимость вовремя, если часы возвращаются на циферблат, он будет генерировать дубликаты идентификаторы), Sharding-JDBC не предоставляет решения, если пользователи хотят укрепить, им нужно расширить самим собой.
Внимательно пишите статьи и делитесь ими с душой.
Персональный сайт:yasinshaw.com
Общедоступный номер: технический круг xy