雪花算法原理(设计原理、优缺点、如何改造它、以及应用)

雪花算法原理(设计原理、优缺点、如何改造它、以及应用)

    • 雪花算法源码
    • 为什么雪花算法是 64 位?
    • 为什么时间戳是41位?占雪花算法的 43-47 bit 位
    • 为什么工作台最大只支持设置 31 ?
    • 工作台设置成了 63 会导致什么后果?
    • 同机器位只支持最大 5 bit位
    • 同理数据累加位只支持最大 12 bit位
    • 雪花算法优点
    • 雪花算法缺点
    • 雪花算法改造
    • 小咸鱼的技术窝

雪花算法源码

雪花算法是一个开源的分布式生成唯一自增 Id 的这么一个工具类。主要的源码如下

/*** 常规雪花算法:1-42bit位:时间戳 (共 42 位)* 43-47 bit位:数据中心ID (共 5 位,最大支持 2 的 5 次方减 1 个数据中心)* 48-52 bit位:工作台ID (共 5 位,最大支持 2 的 5 次方减 1 个工作台)* 53-64 bit位:累加数ID (共 12 位,最大支持 2 的 12 次方)*/
public synchronized long nextId() {long timestamp = timeGen();if (timestamp < lastTimestamp) {throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));}if (lastTimestamp == timestamp) {sequence = (sequence + 1) & sequenceMask;if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;return ((timestamp - twepoch) << 22)| (datacenterId << 17)| (workerId << 12)| sequence;
}

都知道雪花算法结构如下,不知道读者有没有想过 为什么雪花算法是 64 位的?为什么工作机器最大为 5 位?,反正我第一次接触雪花算法的时候,就想过这些问题。

  • 1-42bit位:时间戳 (共 42 位)
  • 43-47 bit位:数据中心ID (共 5 位,最大支持 2 的 5 次方减 1 个数据中心)
  • 48-52 bit位:工作台ID (共 5 位,最大支持 2 的 5 次方减 1 个工作台)
  • 53-64 bit位:累加数ID (共 12 位,最大支持 2 的 12 次方)
    在这里插入图片描述

为什么雪花算法是 64 位?

因为雪花算法返回的是一个 long 类型的值,换算成二进制就是最大 64 位!

为什么时间戳是41位?占雪花算法的 43-47 bit 位

随便一个时间戳转换成二进制就是 41 位

log.info("时间戳:{} 位", Long.toBinaryString(System.currentTimeMillis()).length());

在这里插入图片描述

且雪花算法中的时间戳左移了 22 位,加上时间戳本身的 41 位,加起来就有 63 位了,加上第一位的符号位,就是 64 位,正好等于 long 类型的 64 位。完美利用 long 类型。
在这里插入图片描述

为什么工作台最大只支持设置 31 ?

时间戳达到了最大值,41 位时间戳 bit 位全是 1,留了后 22 位全是 0,由于或运算,运算位有 1 就是 1所以说这个 22 位算是留给累加数、工作台、数据中心的有效左移位,超过这个有效左移位,就会出现生成重复 id 的情况出现。

111111111111111111111111111111111111111110000000000000000000000

工作台达到最大值 31(31换二进制为11111),左移22位后,会得到如下一个二进制数(位数不足63位,前面用0补齐)

000000000000000000000000000000000000000001111100000000000000000

最终得到的运算结果就是这个

111111111111111111111111111111111111111111111100000000000000000

在这里插入图片描述

工作台设置成了 63 会导致什么后果?

63对应的二进制是 6个1(111111),参与的运算结果和工作台设置成31得到的结果一样,就有产生的重复 id 的风险了。因此这也是工作台最大只支持 5 bit 位的原因
在这里插入图片描述

同机器位只支持最大 5 bit位

在时间戳、工作台按最大值运算后,留给数据中心的有效运算位只有 17 位了,然后数据中心又左移了12 位,留给数据中心的参与运算的bit就只有5位了(17-12=5)。同理如果数据中心设置成63,也会有生成重复id的风险出现
在这里插入图片描述

同理数据累加位只支持最大 12 bit位

在时间戳、机器位、工作台按最大值左移后,留给累加数的有效位只有12bit位了(63-41-5-5=12),看我下图圈绿的地方这个就是有效bit位。
在这里插入图片描述

雪花算法优点

按照官方来说就是:

不需要搭建服务集群,代码逻辑非常简单,同一毫秒内,订单ID的序列号自增。同步锁只作用于本机,机器之间互不影响,每毫秒可以生成4百万个订单ID

对比Mysql自增主键:

一般雪花算法用于生成订单ID,相比于 Mysql 自增主键来说,Mysql 自增ID是不是很容易看出你的销量,做个差值计算就好了

对比UUID

UUID是无序的,订单ID都加索引,在你插入数据的时候,维护B+树很好性能,需要频繁的调整叶子结点的数据,还会导致页分裂。简而言之就是性能不高,而雪花算法性能高低延迟

雪花算法缺点

由于时间戳占生成id的41 bit位,且这个时间戳是根据服务器时间生成的,一旦服务器时间回拨了一下,你就嗝屁了,可能会生成重复的 id
在这里插入图片描述

雪花算法改造

基于基因法改造案例如下,详情点击跳转 一文搞懂分库分表算法,通俗易懂(基因法、一致性 hash、时间维度)

   //41 bit 位时间戳,5 bit 位数据中心,5 bit 机器位,5 bit累加位,7 bit 用户基因位long orderId = ((timestamp - twepoch) << 22)| (datacenterId << 17)| (workerId << 12)| (sequence << 7)| uid;

小咸鱼的技术窝

关注不迷路,分享更多技术干货B站、CSDN、微信公众号都是(小咸鱼的技术窝),更多详情在主页
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/166898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 之 final 详解

目录 一. 前言 二. final 的基础使用 2.1. 修饰类 2.2. 修饰方法 2.2.1. private 方法是隐式的 final 2.2.2. final 方法可以被重载 2.3. 修饰参数 2.4. 修饰变量 2.4.1. static final 2.4.2. blank final 2.4.3. 所有 final 修饰的字段都是编译期常量吗&#xff1f…

数据结构:二叉查找树,平衡二叉树AVLTree,红黑树RBTree,平衡多路查找数B-Tree,B+Tree

二叉查找树 二叉树具有以下性质&#xff1a;左子树的键值小于根的键值&#xff0c;右子树的键值大于根的键值。 对该二叉树的节点进行查找发现深度为1的节点的查找次数为1&#xff0c;深度为2的查找次数为2&#xff0c;深度为n的节点的查找次数为n&#xff0c;因此其平均查找次…

2023年亚太数学建模C题数据分享+详细思路

在报名截止的前一天&#xff0c;我尝试进行了报名。到那时&#xff0c;已有11,000个队伍注册参赛。在我的了解中&#xff0c;在数模比赛中除了国赛美赛外&#xff0c;几乎没有其他竞赛的参赛队伍数量能与此相媲美。即便不考虑赛题的难度和认可度&#xff0c;亚太地区的这场竞赛…

JavaScript实现动态背景颜色

JavaScript实现动态背景颜色 前言实现过程HTML实现过程CSS实现过程JS实现过程全部源码 前言 本文主要讲解JavaScript如何实现动态背景颜色&#xff0c;可以根据颜色选择器选择的颜色而实时更新到背景中&#xff0c;如下图所示。 当我们在颜色选择器中改变颜色时&#xff0c;会…

SPSS信度分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

内网渗透之Linux权限提升大法

文章目录 内网渗透|Linux权限提升大法0x01 前言0x02 工具介绍1.traitor2.LinEnum3.linux-exploit-suggester.sh4.Linux Exploit Suggester 25.beroot 0X02提权手法1.环境变量提权2.利用suid提权3.定时任务提权3.1定时任务文件覆盖提权3.2定时任务tar命令通配符注入提权 4.sudo提…

【matlab程序】matlab给风速添加图例大小

【matlab程序】matlab给风速添加图例大小 clear;clc;close all; % load 加载风速数据。 load(matlab.mat) % 加载颜色包信息 gray load(D:\matlab_work\函数名为colormore的颜色索引表制作\R_color_txt\R_color_single\gray89.txt); brown load(D:\matlab_work\函数名为color…

_STORAGE_WRITE_ERROR_ thinkphp报错问题原因

整个报错内容如下 Uncaught exception Think\Exception with message _STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/1338db9dec777aab181d4e74d1bdf964.php in C:\inetpub\wwwroot\ThinkPHP\Common\functions.php:101 Stack trace: #0 C:\inetpub\wwwroot\ThinkPHP\Library\…

JavaFx 设置窗口边框圆角

UI界面要求窗口边框有一定弧度&#xff0c;因为之前没有做过&#xff0c;网上看了很多文章&#xff0c;都用到了css语句 "-fx-background-radius: ; 我在xml布局文件根节点使用无效&#xff0c;在Scene组件设置无效&#xff0c;gpt等ai问了一圈代码也是无效&#xff0c;…

【JavaEE】认识多线程

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《vaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&am…

React + BraftEditor 实现富文本编辑

Braft Editor 是一个基于 React 和 Draft-js 开发的富文本编辑器&#xff0c;提供了丰富的基础功能&#xff0c;如基本文本格式化、列表、链接、图片上传、视频插入等&#xff0c;并且还支持扩展。 首先&#xff0c;确保你已经在项目中安装了 Braft Editor 和它的依赖项&#x…

NPU、CPU、GPU算力及算力计算方式

NVIDIA在9月20日发布的NVIDIA DRIVE Thor 新一代集中式车载计算平台&#xff0c;可在单个安全、可靠的系统上运行高级驾驶员辅助应用和车载信息娱乐应用。提供 2000 万亿次浮点运算性能&#xff08;2000 万亿次8位浮点运算&#xff09;。NVIDIA当代产品是Orin&#xff0c;算力是…

堪比数据恢复大师软件推荐,恢复数据很简单!

“作为一个经常丢失数据的电脑用户来说&#xff0c;我觉得我非常需要一些简单有效的数据恢复方法。大家有什么比较靠谱的软件推荐吗&#xff1f;非常感谢&#xff01;” 在数字化时代&#xff0c;数据的存储是比较重要的。很多用户都会选择将重要的文件保存在电脑上。如果数据丢…

第二证券:北证50指数一枝独秀 短剧游戏概念股持续活跃

周三&#xff0c;沪深两市三大指数颤动调整&#xff0c;北证50指数“鹤立鸡群”&#xff0c;大涨超8%。到收盘&#xff0c;上证综指报3043.61点&#xff0c;跌0.79%&#xff1b;深证成指报9855.66点&#xff0c;跌1.41%&#xff1b;创业板指报1950.01点&#xff0c;跌1.73%。沪…

uni-app,nvue中text标签文本超出宽度不换行问题解决

复现&#xff1a;思路&#xff1a; 将text标签换为rich-text&#xff0c;并给rich-text增加换行的样式class类名解决&#xff1a;

【Vue】浏览器安装vue插件

首先看一下安装之后的效果&#xff0c;再考虑一下要不要安装 安装完之后&#xff0c;打开浏览器控制台&#xff08;ctrl shift j) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</t…

HOOPS Web平台助力开发3D应用,实现超大规模3D web轻量化渲染与数据格式转换!

一、包含的软件开发工具包 HOOPS Web平台帮助开发人员构建基于Web的工程应用程序&#xff0c;提供高级3D Web可视化、准确快速的CAD数据访问和3D数据发布。 HOOPS Web平台包括三个集成软件开发工具包 (SDK)&#xff1a; &#xff08;1&#xff09;Web端3D可视化引擎 HOOPSCom…

mysql查询表的字段,字段名以及注释sql语句

sql语句如下&#xff1a; selecta.ordinal_position 序号,a.COLUMN_name 字段名,a.COLUMN_type 字段类型,(case a.is_nullable when NO then 是 else 否 end) 是否非空,(case a.column_key when PRI then 是 else 否 end) 是否主键,a.COLumn_comment 注释 frominformation_sch…

【C/C++】素数专题

素数专题 1.判断素数模板2.求范围内的素数&#xff08;101-200&#xff09;3.判断素数与分解 1.判断素数模板 #include<stdio.h> #include<math.h>int prism(int n){if(n1) return 0;for(int i2;i<sqrt(n);i){if(n%i0) return 0;}return 1; }int main() {int n…

Doris中的物化视图(十八)

物化视图就是包含了查询结果的数据库对象&#xff0c;可能是对远程数据的本地 copy&#xff0c;也可能是一个表或多表 join 后结果的行或列的子集&#xff0c;也可能是聚合后的结果。说白了&#xff0c;就是预先存储查询结果的一种数据库对象。 在 Doris 中的物化视图&#xf…