SnowFlake

SnowFlake

是一种用于生成全局唯一的ID(通常用于分布式系统中的标识符)的方法。它最初由Twitter提出,目的是在分布式系统中高效地生成不重复的ID。

那么为什么要生成不重复的id呢,使用自增主键不好吗。

现在的服务基本是分布式、微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中 id 的全局唯一性。 对于 MySQL 而言,一个表中的主键 id 一般使用自增的方式,但是如果进行水平分表之后,多个表中会生成重复的 id 值。那么如何保证水平分表后的多张表中的 id 是全局唯一性的呢?

ok,那么就有了雪花算法,或许你还听过uuid,那么接下来我们来对比一下。

我们在之前了解过uuid,那么先来对比一下雪花算法和uuid

雪花算法:
  • 雪花算法生成的ID是一个64位的整数,结构包括时间戳、数据中心ID、机器ID和序列号等部分。
  • 生成的ID是基于当前时间戳、节点标识和序列号计算的,保证了ID的唯一性和有序性。
  • 雪花算法的ID在同一时刻内不同节点生成的ID会有不同的序列号,确保每个节点、每毫秒生成的ID都是唯一的。
  • 雪花算法适合分布式系统,它在设计时考虑了机器分布、数据中心分布等因素。
UUID:
  • UUID是一个128位的标识符,通常表示为一个32位十六进制数(加上4个分隔符)。
  • UUID的生成方式有几种(基于时间戳、随机数、哈希值等),最常见的是版本4(基于随机数),也有版本1(基于时间戳和节点信息)等。
  • UUID生成的标识符是完全随机或基于时间戳的,依赖于算法的设计,通常不考虑分布式机器的节点信息,因此它的生成是去中心化的,不依赖于其他系统。

2. 唯一性

雪花算法:
  • 通过时间戳、数据中心ID、机器ID和序列号的组合保证ID的全局唯一性。每个机器在特定的时间内生成的ID是唯一的。
  • 在分布式系统中,雪花算法确保多个机器生成的ID不会冲突,因此适合分布式环境下的ID生成。
UUID:
  • UUID的版本1通过节点信息(如MAC地址)和时间戳生成ID,因此通常也是唯一的。版本4则是通过随机数生成ID,理论上也能保证全局唯一性。
  • UUID生成的唯一性依赖于实现机制(例如使用随机数的UUID可能存在重复概率,尽管几乎不可能发生),但在高并发环境中,生成UUID时并没有明确的节点信息控制,因此可能会有极小的碰撞概率。

3. 有序性

雪花算法:
  • 雪花算法生成的ID有时间递增的特点,即ID的数字值是随着时间不断增加的。因此,生成的ID天然是有序的。
  • 由于时间戳的存在,ID按生成的时间顺序递增,这在数据库存储、索引等操作时非常有利。
UUID:
  • UUID(尤其是版本4)是随机生成的,生成的ID没有时间顺序,因此UUID不具备自然的有序性。
  • 如果需要排序,可以通过额外的方式处理,比如按时间戳字段进行排序,但UUID本身并不保证ID按时间递增。

后面的部分我们随后了解,最主要的就是其有序性,雪花算法的时间戳生成的ID按照时间递增,有助于在排序操作中使用ID直接进行排序。

而uuid则是无序的完全随机性。

用 UUID 来作为主键,但是 UUID 生成的是一个无序的字符串,对于 MySQL 推荐使用增长的数值类型值作为主键来说不适合。

相关推荐
阿昌喜欢吃黄桃4 天前
RocketMq事务消息原理
java·中间件·消息队列·rocketmq·mq
半夜修仙4 天前
延迟队列的介绍及常见问题
java·数据库·中间件·rabbitmq
手握风云-5 天前
一条消息的旅程:RabbitMQ 学习与实践(一)
中间件·rabbitmq
RH2312115 天前
2026.6.8Linux
java·数据库·中间件
理人综艺好会6 天前
双Token机制在实际项目中的应用与实践
中间件·token
番茄去哪了6 天前
神领物流面试题(一)
java·大数据·中间件
念何架构之路7 天前
消息中间件
中间件
都说名字长不会被发现7 天前
Spring Boot Starter 中间件账号密码加密方案设计与实现
java·spring boot·后端·中间件
瀚高PG实验室7 天前
java中间件无法连接数据库
java·数据库·中间件·瀚高数据库
之歆7 天前
Day11_Express 深入解析:从中间件到项目实战
中间件·express