当前位置: 首页 > article >正文

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 推荐使用增长的数值类型值作为主键来说不适合。


http://www.kler.cn/a/418566.html

相关文章:

  • Java 解析离线 MySQL binlog 文件
  • 【Android】组件化嘻嘻嘻gradle耶耶耶
  • Vue入门级教程二:组件化开发
  • 探索文件系统,Python os库是你的瑞士军刀
  • 【最新鸿蒙开发——应用导航设计】
  • qml项目创建的区别
  • 如何正确使用 GitHub API 获取特定版本信息:详解错误排查与解决方案
  • Word - 图片右键保存
  • Scala关于成绩的常规操作
  • 华为云云连接+squid进行正向代理上网冲浪
  • 【RabbitMQ 消息列队测试之:调试技巧】
  • 【Python数据分析五十个小案例】使用自然语言处理(NLP)技术分析 Twitter 情感
  • 初级数据结构——邻接表
  • 使用图结构增强RAG架构,一文详解LightRAG
  • docker安装clickhouse(单机版)
  • 解决Qt堆栈窗口内子窗口大小不一致的问题
  • HTML5+JavaScript实现消消乐游戏
  • Flask项目入门—request以及Response
  • C与指针。
  • 深度解析MySQL的刷脏机制
  • 11. 名称空间
  • 深入解析 MySQL 启动方式:`systemctl` 与 `mysqld` 的对比与应用
  • 【iOS】《Effective Objective-C 2.0》阅读笔记(一)
  • 力扣103.二叉树的锯齿形层序遍历
  • git clone超大仓库时报错:fatal: early EOF
  • centos挂载ntfs或exFAT格式硬盘