雪花算法生成实例

article/2025/9/19 19:23:19

雪花算法生成实例

  • 一、集群高并发情况下如何保证分布式唯一全局id生成?
    • 1.1 为什么需要分布式全局唯一ID以及分布式ID的业务需求
    • 1.2 ID生成规则部分硬性要求
    • 1.3 ID号生成系统的可用性要求
  • 二、一般通用方案
    • 2.1 UUID
    • 2.2 数据库自增主键
    • 2.3 基于Redis生成全局id策略
    • 2.4 SnowFlake
  • 三、Hutool工具包代码实现


一、集群高并发情况下如何保证分布式唯一全局id生成?


1.1 为什么需要分布式全局唯一ID以及分布式ID的业务需求

对分库分表后需要有一个唯一ID来标识一条数据或消息;
特别一点的如订单、骑手、优惠券也都需要有唯一ID做标识

1.2 ID生成规则部分硬性要求

① 全局唯一:不能出现重复的ID号,作为唯一标识的基本要求
② 趋势递增:MySQL的InnoDB引擎中使用的是聚簇索引,多数索引使用B+树的数据结构来存储索引数据,在主键选择上应尽量使用有序的主键保证写入性能
③ 单调递增:保证下一个ID一定大于上一个ID,新增数据对于索引结构的影响也最小
④ 信息安全:ID信息安全
⑤ 含时间戳:快速了解分布式id的生成时间

1.3 ID号生成系统的可用性要求

① 高可用
② 低延迟
③ 高QPS

二、一般通用方案


2.1 UUID

UUID:(Universally Unique Identifier)的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的36个字符,示例:abcd1234-ef56-2356-elid-23fges458965
性能非常高:本地生成,没有网络消耗
缺点:
无序,每一次UUID数据的插入都会对主键的B+树进行很大的修改,容易引起B+树索引的分裂

2.2 数据库自增主键

数据库自增主键:分布式里,数据库的自增ID机制的主要原理是:数据库自增ID和mysql数据库的replace into实现的(replace into首先尝试插入数据列表中,如果发现表中已经有此行数据(根据主键或唯一索引判断)则先删除,再插入)
缺点:
系统水平扩展比较困难,比如定义好了步长和机器台数之后,如果要添加机器该怎么做?
每次获取ID都得读写一次数据库,非常影响性能,不符合分布式ID里面的延迟低和高QPS的规则(在高并发下,如果都去数据库里面获取id,那是非常影响性能的)

2.3 基于Redis生成全局id策略

基于Redis生成全局id策略:因为Redis是单线程的,天生保证原子性,可以使用原子操作INCR和INCRBY来实现
集群分布式
在Redis集群情况下,可以设置不同的增长步长,同事key一定要设置有效期
缺点:
配置麻烦,维护Redis集群

2.4 SnowFlake

Twitter的分布式自增ID算法
①ID能够按照时间有序生成
②生成id的结果是一个64bit大小的整数,为一个Long型(转换成字符串后长度最多19)
③分布式系统内不会产生ID碰撞(由datacenter和workId作区分)并且效率较高
在这里插入图片描述
号段解析:
1bit-不用
因为二进制中最高位是符号位,1表示负数,0表示正数
生成的id一般都是用整数,所以最高位固定为0

41bit-时间戳,毫秒级
-41位可以表示241-1 个数字,
-如果只用来标识正整数(计算机中正数包含0),可以表示的数值范围是:0至241-1,减1是因为可表示的数值范围是从0开始算的,而不是1(可以使用69年,到2039年)

10bit-工作机器id,用来记录工作机器id
-可以部署在210 = 1024个节点,包括5位datacenter和5位workId
-5位(bit)可以表示的最大正整数是25-1 = 31,即可以用0、1、2、3、…31这32个数字,来表示不同的datacenterId和workId

12bit-序列号,用来记录同毫秒内产生的不同id
-12位(bit)可以表示的最大正整数是212-1 = 4095,即可以用0、1、2、3、…4094这4095个数字,来表示同一机器同一时间截(毫秒)内产生的4095个ID序号

三、Hutool工具包代码实现


Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
引入依赖:

 <!--包含雪花算法的Hutool工具包--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.4.4</version></dependency>

在这里插入图片描述
Controller层:

/*** @Author: Ron* @Create: 2020 10:41*/
@RestController
public class SnowFlakeController {@Autowiredprivate OrderService orderService;@RequestMapping("/snowflake")public String index() {return orderService.getIDBySnowFlake();}
}

Service层:

/*** @Author: Ron* @Create: 2020 10:43*/
public interface OrderService {String getIDBySnowFlake();
}

Impl:

/*** @Author: Ron* @Create: 2020 10:43*/
@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate IdGeneratorSnowflake idGenerator;@Overridepublic String getIDBySnowFlake() {ExecutorService threadPool = Executors.newFixedThreadPool(5);for (int i = 0; i < 20; i++) {threadPool.submit(() -> {System.out.println(idGenerator.snowflakeId());});}threadPool.shutdown();return "Hello SnowFlake!!!";}
}

Mapper层:

/*** @Author: Ron* @Create: 2020 10:46*/
@Repository
@Slf4j
public class IdGeneratorSnowflake {private long workId = 0;private long datacenterId = 1;private Snowflake snowflake = IdUtil.createSnowflake(workId, 1);@PostConstructpublic void init() {workId = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());log.info("当前机器id: {}", workId);}public synchronized long snowflakeId() {return snowflake.nextId();}// 范围为0~31public synchronized long snowflakeId(long workId, long datacenterId) {Snowflake snowflake = IdUtil.createSnowflake(workId, datacenterId);return snowflake.nextId();}public static void main(String[] args) {System.out.println(new IdGeneratorSnowflake().snowflakeId());}}

启动类:

@SpringBootApplication
public class TestApplication {public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);}}

application.yml配置文件

server:port: 8888

页面访问:
在这里插入图片描述
控制台打印结果:

在这里插入图片描述
缺点:
依赖机器时钟,如果机器时钟回拨,会导致重复ID生成
在单机上是递增的,但是由于设计到分布式环境,每台机器的时钟不可能完全同步,有时候会出现不是全局递增的情况(此缺点可以认为无所谓,一般分布式ID只要求趋势递增,并不会严格要求递增,90%的需求都只要求趋势递增)


http://chatgpt.dhexx.cn/article/tByNIq7M.shtml

相关文章

算法 —— 雪花算法

文章目录 算法 —— 雪花算法简介实现原理结构图 算法 —— 雪花算法 简介 雪花算法是由 Twitter 公布的分布式主键生成算法&#xff0c;它能够保证不同进程主键的不重复性&#xff0c;以及相同进程主键的有序性。 实现原理 在同一个进程中&#xff0c;它首先是通过时间位保…

java雪花算法实现

基于雪花算法&#xff08;Snowflake&#xff09;模式雪花算法&#xff08;Snowflake&#xff09;是twitter公司内部分布式项目采用的ID生成算法&#xff0c;开源后广受国内大厂的好评&#xff0c;在该算法影响下各大公司相继开发出各具特色的分布式生成器。 Snowflake生成的是L…

雪花算法的实现原理

一位工作4年的小伙伴&#xff0c;去某东面试时被问到这样一道题&#xff0c;说请你简述一下雪花算法的实现原理。屏幕前的小伙伴&#xff0c;如果你遇到这个问题&#xff0c;你会怎么回答&#xff1f; 今天&#xff0c;我给大家分享一下我的理解。 1、什么是雪花算法 雪花算…

Python 实现雪花算法

Python 实现雪花算法 雪花算法&#xff1a;雪花算法是一种分布式全局唯一ID&#xff0c;一般不需要过多的深入了解&#xff0c;一般个人项目用不到分布式之类的大型架构&#xff0c;另一方面&#xff0c;则是因为&#xff0c;就算用到市面上很多 ID 生成器帮我们完成了这项工作…

雪花算法简介以及代码实现

文章目录 雪花算法分布式ID分布式ID需要满足的要求全局唯一:高性能:高可用:方便易用:安全:有序递增:要求具体的业务含义:独立部署: 组成代码实现Java代码实现Go语言实现 雪花算法 简介: 雪花算法是Twitter开源的分布式ID生成算法 Github仓库地址 雪花算法主要用于分布式系统中…

雪花算法(id生成算法)

SnowFlake 雪花算法 SnowFlake 中文意思为雪花&#xff0c;故称为雪花算法。最早是 Twitter 公司在其内部用于分布式环境下生成唯一 ID。在2014年开源 scala 语言版本。 实现原理 雪花算法原理就是生成一个的64位比特位的 long 类型的唯一 id。 最高1位固定值0&#xff0c…

什么是雪花算法?啥原理?

1、SnowFlake核心思想 SnowFlake 算法&#xff0c;是 Twitter 开源的分布式 ID 生成算法。 其核心思想就是&#xff1a;使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛&#xff0c;且 ID 引入了时间戳&#xff0c;基本上保持自增的&#xf…

雪花算法-java

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;计算机基础专栏 &#x1f4e7;如果文章知识点有错误的地方&#…

数据库中雪花算法是什么?

一、为何要用雪花算法 1、问题产生的背景 现如今越来越多的公司都在用分布式、微服务&#xff0c;那么对应的就会针对不同的服务进行数据库拆分&#xff0c;然后当数据量上来的时候也会进行分表&#xff0c;那么随之而来的就是分表以后id的问题。 例如之前单体项目中一个表中…

snowflake算法(雪花算法)

snowflake算法(雪花算法) 1.snowflake算法介绍 Snowflake算法产生是为了满足Twitter每秒上万条消息的请求&#xff0c;每条消息都必须分配一条唯一的id&#xff0c;这些id还需要一些大致的顺序&#xff08;方便客户端排序&#xff09;&#xff0c;并且在分布式系统中不同机器…

分布式ID生成算法——雪花算法

一、分布式ID ID可以唯一标识一条记录。 对于单体架构&#xff0c;我们可以使用自增ID来保证ID的唯一性。但是&#xff0c;在分布式系统中&#xff0c;简单的使用自增ID就会导致ID冲突。这也就引出了分布式ID问题。分布式ID也要求满足分布式系统的高性能、高可用、高并发的特点…

【SnowFlake】雪花算法(Java版本)

SnowFlake雪花算法&#xff08;Java版本&#xff09; 一、SnowFlake算法二、代码实现三、应用场景四、优缺点五、分布式生成ID方式 一、SnowFlake算法 雪花算法(Snowflake)是twitter公司内部分布式项目采用的ID生成算法 Snowflake生成的是Long类型的ID&#xff0c;一个Long类型…

雪花算法以及具体实现

一、为何要用雪花算法 1、问题产生的背景 现如今越来越多的公司都在用分布式、微服务&#xff0c;那么对应的就会针对不同的服务进行数据库拆分&#xff0c;然后当数据量上来的时候也会进行分表&#xff0c;那么随之而来的就是分表以后id的问题。 例如之前单体项目中一个表中的…

什么是雪花算法,详解雪花算法原理

雪花算法(SnowFlake) 雪花算法是Twitter开源的分布式ID生成算法. 主要是由64bit的long型生成的全局ID,引入了时间戳和ID保持自增的属性. 64bit分为四个部分: 第一个部分是1bit, 这不 使用,没有意义; 第二个部分是41bit, 组成时间戳; 第三个部分是10bit, 工作机器ID,里面分为…

雪花算法原理及实现

背景 分布式高并发的环境下&#xff0c;最常见的就是每年双十一的十二点&#xff0c;大量用户同时抢购同一商品&#xff0c;毫秒级的时间下可能生成数万个订单&#xff0c;此时确保生成订单ID的唯一性变得至关重要。此外&#xff0c;在秒杀环境下&#xff0c;不仅要保障ID唯一…

雪花算法的原理和实现Java

SnowFlake 算法&#xff0c;是 Twitter 开源的分布式 id 生成算法。其核心思想就是&#xff1a;使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛&#xff0c;且ID 引入了时间戳&#xff0c;基本上保持自增的&#xff0c;后面的代码中有详细的注…

雪花算法简介

文章目录 1、简介2、雪花算法3、算法实现4、算法优缺点5、补充 1、简介 在生成随机主键的时候&#xff0c;我第一个想到的就是UUID&#xff0c;但是UUID在MySQL中作为主键生成时&#xff0c;就会出现一个问题&#xff0c;UUID生成的是乱序的。这时候&#xff0c;学习MP的过程中…

雪花算法

文章目录 1、雪花算法的起源2、雪花算法原理3、雪花算法java实现4、一些细节讨论4.1调整比特位分布4.2workerid一般如何生成 1、雪花算法的起源 snowflake中文的意思是 雪花&#xff0c;雪片&#xff0c;所以翻译成雪花算法。它最早是twitter内部使用的分布式环境下的唯一ID生…

SnowFlake 雪花算法详解与实现

我是陈皮&#xff0c;一个在互联网 Coding 的 ITer&#xff0c;个人微信公众号「陈皮的JavaLib」关注第一时间阅读最新文章。 文章目录 背景SnowFlake 雪花算法算法实现算法验证算法优缺点注意事项 背景 现在的服务基本是分布式&#xff0c;微服务形式的&#xff0c;而且大数据…

雪花算法(SnowFlake)

简介 现在的服务基本是分布式、微服务形式的&#xff0c;而且大数据量也导致分库分表的产生&#xff0c;对于水平分表就需要保证表中 id 的全局唯一性。 对于 MySQL 而言&#xff0c;一个表中的主键 id 一般使用自增的方式&#xff0c;但是如果进行水平分表之后&#xff0c;多…