00:00
那么雪花算法呢,是。推特它的分布式自增ID算法叫snowflake。那么它。又比上面的right。更好。因为它就是一套算法,但是呢,它还是讲有点复杂,那么这个算法是什么,怎么用?那么我们这个下半场请同学们打起精神跟我熬过来,工作中一般就用这个,那么据我所知,像京东还有很多大厂都是用推特这个开源了以后成熟的分布式自动ID算法,当然它也有一些小细节问题,你可以有源码以后加以改进,自己去做,晚上已经有成熟的解决方案,大家工作中推荐大家用这个,你用这个red集群我讲过了,不是不可以,但是哎呀,为了生成一个idea,引入那么多的工程建设,有点高射炮打蚊子不值当,投入精力太大,投入产出比性能不高,那么我们来看一下推特的。Snowflake雪花算法。
01:01
首先,那么这货是个啥?那么雪花这名字起的挺好听的哈,什么是雪花?不用我多废话,那么来吧,直接。我们呢,来看看这个雪花算法它是什么意思啊,那么同学们要求大家先简单的阅读一下,我就不在照本宣科。好,同学们,那么推特就解决了它的水画算法去解决这种需求,那么最初推特呢,是要把他们的系统呢,存储系统做MYSQL,你看为什么用MYSQL,推特是不是也在用?不用我解说这个推什么吧。对吧?啊,当然我们不能,我们国家是不能正常访问的啊,这个就不要多废话了,那么迁移到CA。这个是什么?推Facebook开发的一套,那数据库啊,你把它当做Facebook版的red那么一样,所以说同一个世界,同样的技术,他们也需要,这些大厂更加需要这种高可用、低延迟和高QPS的分布式集群ID唯一性解决方案的方法,所以说我们跟着大肠走。
02:04
呢,来了以后,那么弟兄们来。他呢?每秒大概能够产生26万个自尊可排序的idea,当然这是一些理论纯数字了哈,我们不用去关心,反正一句话都够推特用了,肯定够你们公司用。那么由于以前推特的这个cacent这个数据库啊,就是Facebook版的这个数据库,它没有顺序ID生成机制啊,所以他们开发了这么一套,我们直接拿来参考改进,消化吸收。巴拉巴拉。Lo算法可以生成ID,能够按照时间有限,并且它生成ID,结果是一个64位的大小的什么,说白了就是浪形的整数,那么由于一个浪形,那么它的转换字符串这个。Idea。小于等于19位,好,有个概念就行,当然我们详细会说它是什么,先说它的特点就行,再来分布式系统内不会产生ID碰撞,它由数据中心和机器码ID来作为区分,并且效率很高。那么至于说这两个,我们待会聊,那么我们再来回顾一下为什么要用雪花算法,以及我们用雪花算法可以解决哪些问题。
03:15
第一个分布式系统当中有一些需要使用全局ID的场景,那么。过来。首先,全局且为一。我们前面讲的这三个。U有ID买SQL red,它们各自的缺点和优势啊,那么U有ID只有唯一性,没有办法保持单调顺序递增,那么数据库的话呢,干嘛由于你这个UUID要是存进去,将会导致B速所有的叶子节点干嘛产生一些空位和留白,那么所以说不大OK。那么另外我们的干嘛?集群配置化太烦,我为了一个ID引入,所以说不大好,那么最终我们还不想让人家猜出来,那么兄弟们,我就是用这个的话呢,大家请看我每点一下出个数字啊,人家是不是也可以猜到我今天的业务量和订单量是多少,没有符合不好猜。
04:10
猜不准的这个业务诉求,那么所以说我们过来来,首先用为什么用雪花算法,雪花算法是什么,我们呢做了了解,那么接下来详细说学画算法是个什么鬼,注意先看。它可以用通过这种算法生成一个ID,是64位大小的一个整数,这个就是个浪形,那么它转换成字符串的长度多少位,19位,那么下面兄弟们过来看。首先雪花算法的核心部分从左到右,由于计算机是二进制啊,那么就是01010101,总共64位,那么来分成从左到右这么几个部分。意外。41万。十位12位兄弟们,一加41加十加12是不是将加好就是64位,由于我们在Java中64位对应的整数啊,一定是浪型,这个是八种基本类型最大的那个整数位,不多不多说了啊,这个javac基础知识。
05:16
所以说雪花算法它生成的idea就要用long型来存储,那么这个是什么意思呢?首先。第一位叫符号位,那么兄弟们走人。永远不用且永远为零,因为二进制当中最高位是符号位,听懂了吧,一负零正,一般我们说编号序号没有说负,学号没有说15号,同学请站起来,没有说负15号的,所以说这个永远为零且不用,所以说最高位固定为零,零表示正整数,第一步OK。那么第二步兄弟们是41位,什么鬼?时间戳代表在41位,那么如果41位极端情况下全是一二,就是11个一二,那么11个一翻译成二进制了以后,就是二的41次方。
06:13
那么大概。干嘛?一年是365天,一天是24小时,每小时是60分钟,每一分钟是60秒,每一秒等于1000毫秒,那么说明这个雪花算法大概可以。用69.73年。听懂,那么这个算法大哥,这个你没有哪个系统是69.73年吧,当然待会儿我们会详细讲这个说白了再说白点。那么这个69年。从哪一年到哪一年。听好,大致是从1970年到我们的2039年,那么言下之意,这就是接近70年,说白了,待会儿我会给大家证明这个雪花算法正常情况下而言,一般你们去看帖子啊,他都会说根据41位时间戳啊,它可以用接近69.73,四舍五入嘛,就算70年或者69年,那么从哪到哪69年,那再说白了,你回答我这个雪花算法可以用到几号?
07:14
那么大概这个学画算法以现在是2019年来算,它目前。按照他的算法可以大概用到2039年,待会我们会说好,那么这是第二段,第三段是十位的工作进程编号,那么一般是五五开,那么前五个,那么来哈,同学们,我们来看一下。有没有看到data center是不是叫数据中心work idea工作机器码块,那么言下之意是每一个不同的机房的每一个不同的机器码,那么来吧,得了多少位呢?十位是工作进程位,那么过来。他的这个意思是这样的。来哈,刚才这是41位的,也给大家详细讲过了,一般它所能表达的最高,那么就是零到二的,我这么写的意思就是二的41次方减一的数字啊,那么在这兄弟们,呃,为什么是41,这假设它全是什么一一因为二进制嘛,那么来过来这儿。
08:16
为什么要减个一?因为减一式表示的数值范围是从零开始,而不是从一,哈,那么这一点过来第三步第三段。十位。工作进程位一般是五五开,那么过来是这样的,那么大家请看哈,可以部署在二的十次方个,那么什么意思呢?因为计算机都是二进制啊,如果你这是十位,全是十位十个一,那么说明每一位都占,那么这个时候是不是就是十个一就代表二的十次方,那么二的十次方就刚好是1024个节点,那么它呢,一般是五加五等于12。基本上这个五就代表它的数据中心和机房机器码等等,那么过来我们这儿它能所表示最大数字就是二的五次方减一,共计31,那么也就是说到时候我们来传这个机房ID,这个机器码的话,就是数字呢,选值就是从零到31,那么。
09:15
理论上来讲,就是说我现在一个可以有最多有32个机房,每个机房你可以把它当做有32台机器,那么这样可以干成1024个节点。好,最后第四部分是12位的序列号位,那么就是它每秒钟每个机房的某台机器产生的编码号,那么过来。用来记录同一毫秒注意什么级别?毫秒内啊,产生的不同ID12位可以表示最大正整数是二的12次方减一,4095个,那么也就是我们可以用0123,也就是说最后每一个机房的每一个机器,最后这12位都可以产生这四千零四十九十五个数字,那么来表示啊,一台机器一毫秒内就能产生4095个ID序号,那么1000秒,1000毫秒是一秒,你算算在这儿是不是就相当于一秒钟可以干成4.09?
10:16
四百零九五千个ID。这么说能跟上,那么所以说同学们,我们可以得到一个结论,雪花算法生成的ID按时间趋势总体而言是递增的,那么整个分布式ID它不会重复,因为你分成不同的区域,机器码和不同的机房来做区分,那么每一毫秒就生成4000。零九十五个,那么你算算干嘛?一秒钟跟毫秒是1000的兑换,那么你的ID重复的概率大大下降。好,那么接下来,那么这个雪花算法推特把它开源了以后放哪呢?放在我们的github。复习一下兄弟们,如果说去get up上面去找东东。
11:05
没问题了吧,就到公司第一个命令数用克隆好,那对于这个结构我们呢。待会再说一下,咱们先把github那个事说完,那么你去github上面呢,可以看这一个网址,Github推特,它的架构下面呢,有一个这个snowflake雪花算法,那么在这儿有相当的说明,有兴趣的可以去看一下。那接下来同学们,老师呢,都已经给杨哥呢,给大家呢,录下来呢,都已经整好了,待会我们来说这个学画算法它的源码,然后。同学们,请跟着我来。那接下来我们呢,根据刚才所讲的这个东东,在我看我想了一下,在看源码之前哈,那么还是需要给同学们再说一下它的核心组成。零。代表的是符号Y。
12:00
好,那么41位是什么概念呢?就是我们是不是说过可以变成41个一啊,那么假设啊,同学们,我们这次这么干。那我从其他地呢?写这么一个,兄弟们搂一眼,这是刚才那个case啊,这个不多废话,输掉。言下之意呢,我们先来说一下这个雪花算法的第二部分,41位时间戳,大家看这个字符串长度是不是就刚好是41位,这个没有错了吧?什么意思呢?就是说假设。高位不动。这个。到这个这次是因为。二进制二有零有一有有零有一,有零有一,那么这个时候假设最大的时候全部是一,那么好。过来这儿就是十一四十一个一,那么我们要做一下进制的翻译和转换,打开我们的一个二进制转换工具。那现在我们呢,这个一一呢,我们呢,直接呢过来这儿看一眼。
13:07
如果是二进制的一一共计41万。那么一转换。相当于十进制二。我们就得到这么一个浪形的时间戳,那么大家请看,就是211,也就是二进制的41个一,它的。时间戳。相当于这个浪形的数字就是这么大,那么好,我们来看看这个时间戳,翻译过来,那么言下之意是41个一是什么意思呢?就是决定了这个雪花算法,假设你这个时间初二。这个到这个41位全用满了,那么可以用到什么时候,因为你们在网上呢,会看到说大概说是可以用69年,那么这个是从哪到哪的69年,那么接下来我们要翻一下,如果现在这41个一全用满了,是这么一个时间戳,截止到现在,我们可以用到什么时候那么过来。
14:04
带塔带塔等于零。Date,那么同学们u date哈,最经典的那么date.set是吗?Time大家看这是不是应该有个long?OK,丢进来。那么过来,我们simple data。负,然后呢,YYYY杠小M不大,M-DD。第二,Form,然后把我们的date丢进去,输出。过来。弟兄们。跑一下。大家猜猜这个值是多少?也就是说,假设推特这个雪花算法全部用满了,看多少呀,也就是说用到2039年9月7号。够用了,现在是2019年20,你应该开发一个系统,那20年以后天猫淘宝这种高并发系统还在不在,那都是另外一回事,一句话。
15:04
管用,够用,那么一般我们都明白像什么settime,它说明什么,是不是1970年1月1号,那么兄弟们,我们来看一眼哈。那么这个时候我们2039年减去1970年。弟兄们,Not e,我们一减一执行我们得到的一个结论,大家看看这个数字啊。我们漏眼多少,是不是69年,那么所以说我们这个雪花算法,按照这样的一种推测,跟他这个算法是一样,大概就是能够用到69年,说白了就是用到2039年9月7号足够你用了,好吧,那么接下来再一样假设十位这么一个假设有。那么我们是五加五嘛,这儿已经说过了,这个五加50嘛,五位机器嘛,还有机房和机器ID,那么一般大家都明白二的五次方是不是32,由于我们的数式从零开一,从零开始,那么所以说要减个一,31,那么言下之一,这个时候再把用这个静止再给大家说一下,那么假设我们全用满了。
16:12
齐抓满园。你大家看。二进制的五个一一转换是不是就是十进制的31那么一样。再过来一转换,说明什么?全是一,全用满它的工作机房这些等等,那么说明什么?它可以产生多少个1024个节点?由于我们从零开始减个一,那么就是从零到1023,数字就是数这么大,大家看。十位。一折合成十进制,就是10230~1023个机器,那么可以最多可以干得出多少1024个节点,这块懂了吧,好,那么接下来如果懂了这个以后,那么兄弟们好说了,Get HUB上面雪花算法已经开源了,那么这个时候,但是呢,推特呢,很不地道。
17:05
他呢是用skyla这个语言写的,那么有很多网上的活雷锋就参考着他的SKY版本的写法,改成了Java版,那么也给大家准备好了,我们这个不用你写啊,呃,你了解就行了,我们来看一眼。那么同学们。大家跟着我来。那么首先这个。叫工作机器ID work ID,这个叫data center叫数据中心ID。啥意思呢?对应着我们的这个雪花算法,玩就是玩这张图哈,兄弟们。这两个单位的定义就是指工作进程位五位。Work ID,五位贝塔center中心ID,那么它们的取值分别是零到31,刚才我们算过了,那么然后毫秒内的序列,那么这个时候同学们,我们在这儿序列位号讲过了多少4095个毫秒级的ID,那么就是零到4095。
18:06
那么分别都给大家写好了。大家请看。我们这儿干什么呢?上次生成的ID时间戳还没有生成的负1L,那么开始时间是2019年1月1号,那么这个就是一个我们的是吗?时间戳,那么这个时间戳怎么获得?我们讲过这个Java我们都明白在这个date,这是不是还可以是date.get time so,那么这个时候兄弟们大家请看是不是就是。此时此刻。我们的这个。时间戳就这么一个过来,那么一般我们要是按照今年来说嘛,我们肯定是从这个。嗯。19年1月1号开药,因为我们的这个程序大家都清楚,Get time,人家说的时间是不是也是从1970年的1月1号,所以说呢,一一对应啊,是这么个意思啊。
19:01
然后呢,这块呢是work ID。BY就是五位最多,那么我们两个,当然这你是不是可以分成三和七啊,那么这个你就看你那么也就是说假设啊,你这儿沃克idea。假设你的数据中心或者是写的是五。那么也就是说五位来做,那么五位最多是不是五个一,那么二的五次方是32,那么说明什么概念?你就可以派最高的32个节点。那么再来。我们在下面所数值ID所上的标识位也是一样,那么这些同学们大家呢,发给大家自行去看一眼哈,那假设再说直白一点,这些的话大家了解一下即可,那么我们这取得工作ID,数据中心ID巴拉巴拉注意。全部的要获得相应ID,什么行程安全加锁,那么来吧同学们,这个就是它开源的一个源代码,那么这个时候同学们请看我们呢,直接过来假设啊,我们的work ID现在填的是一,这个数据中心也是一,那么。
20:14
从零开始啊,那么这个时候你也可以从零。从零这样开始,零号机器码,零号数据中心,那么这个时候同学们请看14,那么这个时候我们运行一下,大家请看18位,那么这个时候每一次我们说过啊,雪花算法是小于等于19位以内都可以啊,有可能你会生成由于这个。日子开始时间戳不一样,会导致你这个位缩也不一样哈,那么在这我们这块呢,就可以看到这就是推特,它开源给我们的一些算法,那么雪花算法的实质就是玩这个机器I idea和这个生态中心I,因为其他的几乎这个是写死的时间戳此时此刻今今年的1月1号开始,那么这个是期房ID和这个多少,后面的话按照毫秒数,每毫秒4095个ID,那么就是填这两个即可,好处是什么?兄弟们,就这么一个算法,我们是不是不需要引入MYQL,不需要引入red,可以搞定我们这件事啊。
21:17
好,那么。那么我们工作中是不是用这个呢?抱歉的通知大家,这个是给大家用来学习的,工作当中不用这么写,他给你源码了,你要是想去封装,你可以自己去改你的东东,那比如说在这块你就不显示五位,你把它改成这是三,这是七,听懂,那么这个是圆码,你自己去封装,那么。万幸,做Java的幸福呢,就是当你能想到,别人也能想到,那么接下来我们呢?就来介绍我们的工程落地经验。基本上,如果要用雪花算法整合spring,我们会用一个东西叫糊涂工具包。
22:00
好,那么在这我们呢,来请大家呢,跟着我来先休息一下,我们再继续。好,同学们做好开工,那么前面我们讲了。我们现在呢,从理论到结构。再到。我们的推特公开的源码大致串讲了一遍,那么接下来就是你工作中怎么用,工作中用很简单,那么由于目前主流都是spring boot了,我们要讲一下spring boot整合整合雪花算法使用,并且用多线程来取得。那么接下来。由于Java里面大部分已经有高人给我们写好了这个雪花算法,那么目前而言,市面上主流我们可以用糊涂工具包。那么这个时候呢,地址如下,我们来讲一下。我们呢,根据我们的源码呢,我们刚才呢,已经生成了一大堆雪花算法,通过雪花算法以后生成一堆。
23:01
Long型的ID号,那么我们来看看这个糊涂工具包是什么意思啊,打开get HUB以后。我们可以看到就在这儿,它干了什么呢?它除了能给你生成雪花算法以外,它可以有,你看它是为什么叫糊涂工具包呢?Who tools,你看or,那么就是全部,这个全家桶,那么有a op,有不能过滤器,有目前的缓存等等等等,那么这些大家请看,那么它是一个小耳全的工具内裤,强烈推荐大家使用,非常爽。那么这个时候呢,就是说白了啊。我们举个举,用它举的一个最简简单的case啊。名称由来大家自己去读,以前我们干活,我们现在要要有一个MD5码。M mod5的编码,搜Java,巴拉巴拉复制粘贴改改就好用了。现在例如引入这个工具包,直接security u.MD5直接给你出来,他专门干的就是小而美的事情,我非常喜欢了。
24:01
它呢,主要就是。Java工具包了以后,可以让我们写出一些小工具类,什么线程加密啊等等哈,包括一些编码,MD 5base日期啊,配置文件这些东东都可以,那么用法也很简单,那么所以说我们在这儿来看一下它有那么多,那么我们引入哪个呢?我们直接引入这个就足以,它这个里面就含有雪花算法的支持。好,那么如果你想要全全家桶,就按照他的操作手册文档干这个哈,那么接下来我们呢。在每项目就引入这个,我们来试试一下怎么用这个工具,使用是很简单,就每稳一贴用一下API就行了,重要的是技术选型懂得。雪花算法的编码,禁止管理进位的原理跟人家说清楚,那么最终咱们来干活,那么干活我们怎么玩呢?那么接下来同学们。
25:01
走到大纲第一步,那么我们呢?要粘泡沫,那么根据我们刚才所讲的,我只粘了这么一个,为啥我没有粘握啊,太多了,我那是用到什么,我加载什么版本,是这个一粘到我们的一个。每本项目里面即可,那么由于大家学到这儿严格节约时间,已经呢给大家呢做好这么一个。微服务的。工程,那么我们就引入了这个一个这是第一步,那么第二步。节约时间,这些都不用废话了,对吧,那么一般我们呢,是不是controller service啊,那么假设我们现在演示啊,我们在这个rest风格里面。点一个循换算法,那么你给我返回一个是吗?循环算法的这么一个变量值,那么好,我干更复杂一点,那么言下之意,我现在是不是要通过糊图算法的这个开源工具写进到我们的service层,我们直接说白了,希望你能够写这么一个业务逻辑内。
26:05
直接在service层out自动注入,然后调这个里面的一个方法,OK,就可以给我们返回,好,那么接下来我们这个一些问题重点是不是就要变成了写这么一个工具类呀。那么这个工具呢,那么借助我们的糊图工具包,那么怎么写呢?首先引入book以后,那么日志啊,就要用这个了,那么再加上spring的这个boot里面的话,我们整到容器里面,我们这儿是一个类似于一个什么YouTube的一个工具类,那么严格呢,就偷个懒,这儿呢直接呢就注入了啊,就不再去写那些繁琐的配置啊,那么接下来我们该怎么写呢?那么第一个private,那么long形我们讲过了。沃克。那么。ID等于零,我们的工作中心对吧,数据中心这些通道,那么private,那么snow。
27:03
Snowflake。来吧,看,注意R是选糊涂包,那么这块过来,糊涂包过来了以后,那么它里面有个ID。You啊,还是找到我们的糊涂吧。第二,Create snowflake,你看它是不是要让我们传入这个workd和数据中心D,那么在这你可以定在这个上面,也可以给它写死进去,好,那么当然哈,尽量呢,我们呢。干嘛?不写死啊对吧,那么假设这我们呢,写好一个就是一,那比方说这个是零,这个是一,我们讲过啊,这个数字的体验的范围是零到31啊,就看你是多机房,多机器是多少就是多少,比方说零号机房,一号机器,那么或者是七号机房。16号机器都可以那么有等你那么好,那么接下来。说白了,那么干脆呢,在这块呢,也就是我们的这个值吧,那么浪形的贝塔三塔,那么同学们那么刚说了不写死的话呢,我也就遵守我的这个,那么在这块我就写个一吧,那么来弟兄们,这个没有任何问题吧,都这么一回事哈,那这是第一步。
28:19
定义了这么两个东东,那么第二步我们呢,Public avoid干嘛?是不是要进行我们初始化值的加载呀?那么过了么post control了,这个是什么意思啊?讲过了吧,这个注解,注意它跟不是BOO的啊,是Java X and,那么这货是干什么?说白了这个方法是不是用于需要被执行关,只要是依赖注入了以后,说白了就是完成一个什么动作,Post构造完了以后开始执行,那说穿了就是加载一些初始化的工作,那么我们的这个work idea。那么过来上面是设了,那么过来干嘛呢?我们的net u得到你这个网络机房的那么IP,目前我们都是IPV4。
29:09
然后呢,Ne。u.get那么注意啊,同学们,严格呢,给你写一遍这些代码,你不要害怕,你去工作中你不会去写的,因为这个应该都是由技术经理和架构师给你写好了。但是。我们呢,为了应付大厂的面试啊,还是杨哥带着你呢过一遍好吧,那么你看你部署了以后,你大家现在是不是主流都是用IPV4啊,那么得到我们本地的主机的一个什么。Work ID这么样一个编码,那么过了logo第二能不能应付?我来这。来八我们跑到这,那么这一块呢,我们得到当前。机器的什么东东,我可。
30:00
Idea这个呢,给你呢,直接呢。使用,然后这块我看ID,因为我们传的是一个零,但是他自己去取的话,它会有一个时间戳哈,那么来这块肯定对于这样的肯定要小心,那么踹开吃。都起。那么。OK,那么如果是catch了怎么办呢?弟兄们,那么我们后台要打个异常吧,Look warning,那么警告,那么这个时候我们要小心,那么。这一块也依旧拷贝过来吧,也懒得写了,看了当前记括ID怎么着。直接告诉他获取失败,那么把我们这个一先写进来,怎么跑到这。好,那么这是第一个,那么最终也没有什么了,加载成功一般都可以哈,机房的这种IP啊,通电网络以后都基本上能够有,然后final也可以先去掉,但这个的话还要需要再完善,那么我们呢,直接我们的worker。
31:17
ID9。等于我们的net u,这个是糊图包里面的工具呢,啊,那么这个呢,看杨格操作一遍,不熟悉的同学呢,到时自己去看一下文档哈,我发给大家的资料,我get local。哎呀,这是一个标点符号哈,诶,Get,那么local host string,那么直接传给它还是编码,总之一句话,这个这个串,这个时间戳,你不能给它空了哈,那么这个机器码呢哈,你不要给它空了,那么接下来OK,完火以后,这种初始化加载完成很简单了,其实说穿了这个是我写的工具呢,弧图算法,最终它里面是有个东西叫什么I Du,就是调调它的方法就行了,那么同学们也不要觉得难,那么打开源码一看,它有些什么,这个工具呢?可以创建雪花算法,可以创建fast u ID,可以创建fast simple u I,那么包括你看创建雪化算法,得到雪花算法这两个漏弄是不是就传我们刚才的work ID和数据中心ID,那么等你看random ID等等,不难哈,我们相当于说在外面做了一层封装。
32:23
那么过了,那么接下来,那么public,那么由于size,那么这个时候long干嘛?Snow。Likelike I idea,那么这个时候兄弟们这种就是简单版的,那么return,那么snow flake.ne idea,那么这个snow snowflake哪来的,是不是上面我们用这个I Du创建过来,刚才刚看了源码在这儿它直接可以取得,那么就从这idd那么获得在这哈,那么过来在这儿完火以后,那么同学们,那么这个方法我们可以呢,再加它一个方法相关的重构。
33:05
那么这个重构的意思是什么鬼呢?那么接下来我们相当于说这个里面我们的重构方法也是要加这两个参数,那么跑到这儿给大家一写好,那么方法,那么这个就是如果说你调用这个,那么就是用原来默认的,如果说你这个零跟一不是这样的,那么你可以自己去重新指定啊,当然再次强调这两个值的范围都是零到31,不要过头了。那么过来这。那么这个时候我们呢?又可以得到我们的。新的这个版本snowflake snowflake,那么就等于我们的ID一定写慢点哈,一定要保证正确U第二,Create snowflake,那么把这两个。丢进来,作为你新版本,你要去传的东不懂,然后通过它再返回我们的SOID,好,那么这是两个最基本的,好,那么接下来。
34:08
同学们,我们来看我们的核心代码这块呢,杨哥呢,都给大家呢整理好了啊,包括还有一些其他方法,你们可以自己下去去粘贴,那么这个时候呢,还是带着大家来写一遍,那么写一遍完了以后,我们整明白了以后,那好不好使呢?那么假设我们在这这个class的尿这个第二,那么。可以得到我们的六的这么一个对象,我们直接就先用这么一个东东,兄弟们没问题吧,那么O键好,那么接下来我们来试试我们这个may,那么大家看看,我先上看我们的程序写的正不正确,不合适,在调整么?大家请看这个时候是不是就出现了一个是吗?我们的编码,那么这个就是通过推特的雪花算法生成的一个全局唯一ID号,它不会重复的。基本上小产是够用了,那么接下来我们就说明这个工具类我们已经写好了,那么工具类写好以后,老规矩,什么controlt抽了对吧,调我们的service啊,那么依赖注入以后,相当于说我们这个要用我们这个工具类,我们这个工具类又怎么用呢?你这的演示啊只生成了一个,那么这我们玩法很的直接用多线程生成。
35:19
那么。Service啊,那么thread pool等于。要,那么这样FIX5个,那么现在假设我们多线程一池五线程,那么我们现在就说这个线程池里面有五个线程,那么现在假设我们这一瞬间需要。其里生产。20个。编号那么过来那么老规矩,只要用线程池,那么整完了以后,那么这是不是马上先省的忘记关了下的蛋,那么在这,那么我们这个线程池二,嗯过来第二干什么呢?我们直接。
36:03
Submit提交,那么这个就是说我们的多线程的请求,每个多线程过来都想要一个。也就是20个请求发过来,由这五个人处理,相当于20个顾客去一个新程池银行网点,受理窗口有五个,那么他们的作用是干什么呢?我们每一个人过来都想要一个雪花算法的ID,那么第2SOT,那么来弟兄们,当然前台我就直接固定返回一个串了啊,主要是看后台我们这个雪花算法这个东东能不能够成功的生成成功。好,那么接下来那么搞定我们的编号是不是7777那么好,如果一切顺利,找到我们这个主任,那么这个是什么就不接受了,直接给它启动,那么来看一眼,如果一切顺利。我们后台加载不是不是有个post,这个能做吗?我们看看日志啊,那大家看到这完整打印出来,那么请看大家看当前机器码的work ID就这么一个。
37:07
能跟上啊,那么是不是就打出了这句话,那么一开始你看我们得到本机的这个网络的这些IPV4啊,那么得到一个编码值啊,一般这个不会错哈,除非你们机器有问题,好,那么完活以后,那么最终我们下面呢,就要来验证验证那么local host,那么我们现在的ID号是不是我们的7777SNOWLAKE,大家请看前台打出来哈,Snowlake没问题了,那么后台大家搂一来。是不是完完整整20个雪花算法生成的?ID编号,那么这种东西是不是就有我们的唯一识别号获得了加强啊,那么大家请看每一个呢,都有趋势递增,你看11848242819099762,诶690。695688697696694等等等等等等等等,由于我们这是多线程生成的哈,每一个线线程的话,哪个线起哪个后期不一定,但是这我们可以清清爽爽的得到了,我们后台打出来了20个雪花算法生成的唯一ID编号,那么工作中。
38:16
只要你把这个类一加上进去,稍微修改,直接引入程序里面就可用了,好那么雪花算法讲到这大致讲完,但是呢。他呢,要让你说这个雪花算法的优缺点,干脆也给同学们整理好优点。毫秒数啊,在高位自增序列,在低位整个ID都是趋势递增算法保障。第二个,他不依赖。它不依赖我们的第三方系统,就是你不用去引入什么MYQL,引入什么red,说穿了兄弟们,我们现在引入的很简单,自己写了一点代码,是不是就引入了我们这么一个糊图工具包啊,其他没什么,你看不用去管什么,之前讲的哇,我的妈呀,这个舞台red整个集群获得ID,然后呢,又要干什么,各种折腾什么,哪个集群死了要去干嘛?修理就为了一个编号,那么再来可以自根据自身的业务特性分配比特位,非常灵活,那么什么意思呢?如果你觉得这个算法不OK,那么你这儿可以改这些东道,改这些源码都可以哈,那么当然缺点就是依赖机器时钟,如果机器时钟回拨会导致重复ID生成,那么。
39:31
这个出现的概率很小,因为在单机上这些时间片都是递增的,时间都是分分秒秒,只会往前走嘛。由于我们涉及到分布式环境,每台机上的时钟不可能绝对的完全同步走,要走走长的这么几个毫秒是吧,有时候出现不是全局递增的情况,此缺点那么在一般的企业里面运用,几乎可以认为是无所谓,99.999那么一般。
40:01
递增并不严格要求递增90%情况下,我们都满足了,那么那么如果说他这个他一定要他问你说兄弟,我们现在觉得这个雪花算法,它有时钟回波,就是它的这个时间机器重启了,这个时间被你重新设置啊,现在倒退这个时间时光倒流了,导致这个时间时钟呢,产生一些错乱,相当于说同学要大家要对个表,那么再追上你,那么这个时候可能会产生一点点小瑕疵,但真的你想想。差不多经过他的理论测试哈,差不多一秒钟产生26万个ID,一秒钟26万个。一般你们公司我觉得一秒钟下的订单有多少家公司是26万个单子啊,中小企业够了,那么。那如果真是要有时钟问题怎么办呢?那兄弟们业内也已经完整方案,推荐两个,我再次强调,一般公司用雪花算法你自己封装一下足够了,那个时钟回拨问题很少遇到哈,那么如果你觉得还是不行,那么也有两家公司啊,在雪花算法的基础上,彻彻底底呢,也解决了这个时钟回波问题,并且还优化了一下雪花算法,那么这两家公司一个是百度开源的分布式VID生成器UID瑞ta,另外一个就是我们的叶子美团点评的分布式ID生成系统,那么如果这个面试官来问你的话,那你说我们可以参考着这两个再进行我们时钟算法的进行的同步,一般工作中引入糊涂工具包。
41:27
企业项目中来使用足以好,那么呢,同学们辛苦了,我们的这道题目就给大家介绍到这儿。
我来说两句