Идентификатор автоинкремента базы данных
Самый простой способ реализовать это — использовать стратегию автоматического увеличения идентификатора базы данных, напримерMySQL
изauto_increment
. Если две базы данных имеют разную продолжительность синхронизации, можно сгенерировать уникальные идентификаторы для обеспечения высокой доступности.
преимущество
Реализация проста, понятна, монотонно самовозрастающая и абсолютно упорядоченная.
недостаток
- Сильная зависимость от БД, при аварийной БД вся система недоступна, что является фатальной проблемой.
- Узкое место в производительности нумерации идентификаторов ограничено производительностью чтения и записи одного MySQL.
серия UUID
Объедините сетевую карту машины, местное время и случайное число, чтобы сгенерировать UUID. Есть несколько вариантов UUID, которые также являются хорошими реализациями.
преимущество
Локальная генерация, простая генерация, очень хорошая производительность, высокая доступность.
недостаток
- Длина слишком велика, ее неудобно хранить, она неупорядочена и нечитаема, а эффективность запроса низкая.
- Информация не защищена, и алгоритм, который генерирует UUID на основе MAC-адреса, может привести к утечке MAC-адреса.Эта уязвимость использовалась для определения местоположения производителя вируса Melissa.
- Неупорядоченность UUID может привести к частым изменениям расположения данных, что серьезно влияет на производительность.
Идентификатор реализации Redis
Все командные операции Redis являются однопоточными, что само по себе обеспечивает такие функции, какincr
иincreby
Такие самоувеличивающиеся атомарные команды могут гарантировать, что сгенерированные идентификаторы должны быть уникальными и упорядоченными.
Например, используйте Redis для создания серийных номеров, начиная с 0, для каждого дня. Например, номер заказа = дата + самоинкрементный номер текущего дня. Ключ можно генерировать в Redis каждый день и накапливать с помощью INCR.
преимущество
- Гибко и удобно, а производительность лучше, чем у БД.
- Цифровые удостоверения личности упорядочены естественным образом, а более выразительные удостоверения личности можно получить за счет рационального дизайна.
недостаток
- Представляя Redis, рабочая нагрузка по кодированию и настройке относительно велика.
- Если идентификаторы являются непрерывными, злоумышленникам очень легко забрать работу, просто загрузите указанный URL-адрес последовательно; если это номер заказа, это еще более опасно, и конкуренты могут напрямую узнать наш ежедневный объем заказа. . Поэтому в некоторых сценариях приложений идентификаторы должны быть нерегулярными и нерегулярными.
Алгоритм снежинки Twitter генерирует идентификаторы
Для получения подробной информации см.GitHub.com/Twitter/ Скажи нет…
преимущество
- Время упорядочено, количество миллисекунд высокое, последовательность автоинкремента низкая, а весь идентификатор находится в тренде.
- Он не зависит от сторонних систем, таких как базы данных, и развертывается как служба, которая имеет более высокую стабильность и более высокую производительность генерации идентификаторов.
- Биты могут быть распределены в соответствии с их собственными бизнес-характеристиками, что очень гибко.
- Длинный тип.
недостаток
В зависимости от часов машины, если часы на машине перезванивают, это приведет к выдаче дублирующихся номеров или услуга будет недоступна.
Baidu UidGenerator
Байду основан наsnowflake
реализация см.GitHub.com/Baidu/UID-a…
преимущество
То жеTwitter的snowflake算法生成ID
недостаток
Требуется MySQL (встроенный распределитель WorkerID, выделяемый через БД во время запуска; например, пользовательская реализация, БД не является обязательной зависимостью)
Лист Мейтуан
видетьСпециальности.Meituan.com/2017/04/21/…
преимущество
- Аварийное восстановление с высокой доступностью.
- Идентификационный номер представляет собой 64-битное число из 8 байтов, которое имеет тенденцию к увеличению, что соответствует требованиям к первичному ключу для хранения базы данных.
недостаток
- Время простоя БД может сделать всю систему недоступной.
- довольно сложный.
Идентификатор объекта MongoDB
Через «время + машинный код + pid + inc» всего 12 байтов окончательно идентифицируются как шестнадцатеричный символ длиной 24 с помощью 4 + 3 + 2 + 3.
преимущество
- Легкие, разные машины могут легко генерировать его таким же способом, который уникален в глобальном масштабе.
- Генерируется локально, с отметками времени, по заказу и по низкой цене.
- Высокая безопасность.
- Относительно короткие, 24 бита, такие как идентификатор самородков,nuggets.IM/editor/post…
недостаток
- Дольше и труднее запомнить.
- Используя идентификатор машины и идентификатор процесса, нельзя сохранить 64-битное значение Long, можно создать только специальные объекты ObjectId.
Запрограммируйте свой собственный алгоритм снежинки
Ссылаться наTwitter的snowflake算法生成ID
,Ссылаться наMongoDB
изObjectId
Стратегия генерации использует одинаковый идентификатор машины и идентификатор процесса для обеспечения уникальности.