首页 > 编程语言 >雪花算法详解(原理优缺点及代码实现)

雪花算法详解(原理优缺点及代码实现)

时间:2022-10-13 09:58:21浏览次数:90  
标签:优缺点 雪花 41 算法 详解 ID 生成 id

雪花算法详解(原理优缺点及代码实现)-mikechen的互联网架构

目录

雪花算法简介

雪花算法,英文名为snowflake,翻译过来就是是雪花,所以叫雪花算法。

在大自然雪花形成过程中,会形成不同的结构分支,所以说不存在两片完全一样的雪花,表示生成的id如雪花般独一无二。

雪花算法详解(原理优缺点及代码实现)-mikechen的互联网架构

雪花算法,它最早是twitter内部使用的分布式环境下的唯一分布式ID生成算法。

 

雪花算法的优缺点

雪花算法,它至少有如下4个优点:

1.系统环境ID不重复

能满足高并发分布式系统环境ID不重复,比如大家熟知的分布式场景下的数据库表的ID生成。

 

2.生成效率极高

在高并发,以及分布式环境下,除了生成不重复 id,每秒可生成百万个不重复 id,生成效率极高。

 

3.保证基本有序递增

基于时间戳,可以保证基本有序递增,很多业务场景都有这个需求。

 

4.不依赖第三方库

不依赖第三方的库,或者中间件,算法简单,在内存中进行。

 

雪花算法,有一个比较大的缺点:

依赖服务器时间,服务器时钟回拨时可能会生成重复 id。

 

雪花算法原理

详细的雪花算法构造如下图所示:

雪花算法详解(原理优缺点及代码实现)-mikechen的互联网架构

雪花算法的原理:就是生成一个的 64 位的 long 类型的唯一 id,主要分为如下4个部分组成:

1)1位保留 (基本不用)

1位标识:由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0,所以这第一位都是0。

 

2)41位时间戳 

接下来 41 位存储毫秒级时间戳,41位可以表示2^41-1个毫秒的值,转化成单位年则是:(2^41−1)/(1000∗60∗60∗24∗365)=69年 。

41位时间戳 :也就是说这个时间戳可以使用69年不重复,大概可以使用 69 年。

注意:41位时间截不是存储当前时间的时间截,而是存储时间截的差值“当前时间截 – 开始时间截”得到的值。

这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的,一般设置好后就不要去改变了,切记!!!

因为,雪花算法有如下缺点:依赖服务器时间,服务器时钟回拨时可能会生成重复 id

 

3)10位机器

10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId,最多可以部署 2^10=1024 台机器。

这里的5位可以表示的最大正整数是2^5−1=31,即可以用0、1、2、3、….31这32个数字,来表示不同的datecenterId,或workerId。

 

4) 12bit序列号

用来记录同毫秒内产生的不同id,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号。

理论上雪花算法方案的QPS约为409.6w/s,这种分配方式可以保证在任何一个IDC的任何一台机器在任意毫秒内生成的ID都是不同的。

作者简介

陈睿|mikechen,10年+大厂架构经验,《BAT架构技术500期》系列文章作者,专注于互联网架构技术。

阅读mikechen的互联网架构更多技术文章合集

Java并发|JVM|MySQL|Spring|Redis|分布式|高并发

 

标签:优缺点,雪花,41,算法,详解,ID,生成,id
From: https://www.cnblogs.com/mikechenshare/p/16787023.html

相关文章

  • SynchronousQueue详解
    SynchronousQueue介绍【1】SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除操作take。 ......
  • HTTPS涉及的加密算法讲解
    前言从2015年左右开始,Google、Baidu、Facebook等互联网巨头,不谋而合地开始大力推行HTTPS,国内外的大型互联网公司很多也都已经启用了全站HTTPS为鼓励全球网站的HTTPS......
  • LeetCode算法笔记 118. 杨辉三角
    importjunit.framework.TestCase;importjava.util.ArrayList;importjava.util.List;publicclassLeetCode04_2extendsTestCase{/****11......
  • 算法练习-第十七天【二叉树】
    二叉树110.平衡二叉树参考:代码随想录思路二叉树的深度:从根节点出发到该节点的最长简单路径边的条数。二叉树的高度:从该节点出发到叶子节点的最长简单路径的条数。题......
  • 视觉算法工程师招聘|杭州易思维科技
    3D视觉工坊致力于推荐最棒的工作机会,精准地为其找到最佳求职者,做连接优质企业和优质人才的桥梁。易思维简介易思维(杭州)科技有限公司坐落于浙江省杭州市,专注于工业智能视觉领......
  • C#中的泛型详解
    泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性。泛型为.NET框架引入了类型参数(typeparameters)的概念。类型参数使得设计类和方法时,不必确定一个或多个具体参数,其......
  • 海量数据库的查询优化及分页算法方案
     随着“金盾工程”建设的逐步深入和公安信息化的高速发展,公安计算机应用系统被广泛应用在各警种、各部门。与此同时,应用系统体系的核心、系统数据的存放地――数据库也随着......
  • 视觉三维重建核心算法讲解和代码实现(sfm构建稀疏地图和mvs构建稠密地图)
    视觉三维重建=定位定姿 +稠密重建 +surfacereconstruction+纹理贴图。三维重建技术是计算机视觉的重要技术之一,基于视觉的三维重建技术通过深度数据获取、预处理、......
  • PriorityBlockingQueue详解
    PriorityBlockingQueue介绍【1】PriorityBlockingQueue是一个无界的基于数组的优先级阻塞队列,数组的默认长度是11,也可以指定数组的长度,且可以无限的扩充,直到资源消耗......
  • Flask学习笔记(十二)-Flask-Migrate实现数据库迁移详解
    一、定义flask-migrate是基于Alembic的一个封装,并集成到Flask中所有的迁移操作其实都是Alembic做的,能跟踪模型的变化,并将变化映射到数据库中。二、Flask-Migrate安装......