00:00
好,那么接下来呢,我们通过刚才的分析呢,发现之前我们的这一系列的方法呢,大家都是有一些小小的问题的啊,所以呢,我们就来看一下这个能够解决这个问题的叫雪花算法,哎哟雪花算法啊好,雪花算法是吞。真的这个公司大家都知道比较有名哈,是国外的一个互联网公司,他们的用户量呢也非常大,所以他们所要面临的呃,要解决的一个问题呢,也是高并发的这么一个问题,然后人家呢,数据库肯定也是分布式的,所以呢,他一定也会面临着同样的一个ID策略的一个问题,那么人家是怎么解决的呢?核心思想就是有一个很长的一个ID,就是刚才我们看到的那个啊,然后这个很长的ID如果转换成二进制的话呢,它实际上是一个64比特的一个数据啊,那那么它呢,转换成我们的这个,呃,整形的话呢,它际上是一个长整形啊,然后呢,这64比特呢,一共分为四个部分,好,这四个部分呢,大家看后面这个图。
01:05
这个图呢,非常清晰的描述了这四个部分都有哪些内容,首先第一个部分是符号位,那么ID的话,我们的是呃,公司的开发规范当中都要求ID不能为负啊,这是一个业务规范,所以呢,这64位当中的第一个符号位呢,就必须是零啊,因为呃,零的话表示正数好,所以接下来呢,有第二个位置,第二个位置呢,它是一个时间戳,时间戳大家都知道,它所生成的数据呢,它是有先后顺序的,所以这样的话呢,只要你前面的高位。用一个有顺序的一个数据来表示的话,就解决了刚才我们所说的ID无序,然后呃,这个降低它的查询性能这样的一个问题啊,所以说呢,这样的话呢,就解决了前面我们所说的通过UUID啊啊或者是一些。这个呃,这个随机数生成算法呀,啊,这样的一些策略呢,来带来的啊,我们的ID无序的问题,那所以解决这个问题的方案就是前面这块我们用时间错来表示啊,然后呢,这个时间错呢,转换成二进制的话呢,它这面呢,占61个这个比特位,好这个是第二部分的内容,接下来呢,我们看第三部分的内容,第三部分的内容呢,一共是十个比特,这十个比特呢,我们也给它分成两部分。
02:29
这两个部分呢,有五个比特表示的是数据中心,有另外五个比特表示的是机器ID,好,什么叫数据中心呢?就是比如说。我们这个,呃,这个业务规模非常大,我呢在北京啊有一个数据中心,在杭州有一个数据中心,在深圳有一个数据中心啊,甚至在东京,纽约首尔啊都有我的数据中心,所以呢,这个就叫数据中心啊,就实际上就是你的那个机相当于大机房了,对不对啊好,然后呢,在每一个数据中心里面呢,它。
03:07
会有。很多的这个服务器啊,这个部署在这个数据中心当中,所以呢,每一个数据中心当中呢,都会有不同的服务器,那么我们用五个比特位表示数据中心,用另外两个五个比,用另外五个比特位表示数据中心当中所存储的这些机器啊,所以呢,一共十个比特位,我们呢,就可以有1024个节点啊,这样的话,这十个比特位。可以有1024个节点,然后也就是说什么呀。就是我可以有1024台服务器。明白吧,啊好,然后接下来呢,最后这个呢,叫做序列号位,序列号位呢叫做毫秒级的流水号。也就是说在一号,注意是毫秒级,不是一秒啊,毫秒级的流水号,毫秒级的流水号有多少个比特位来表示呢?12个比特位,也就是意味着在一毫秒中。
04:10
在一个数据节点当中,注意我们一共有10024个数据节点,在一毫秒中,在一个数据节点当中,我可以并发的产生4096个不同的ID。明白这个意思吗?啊,所以说它的并发量是非常大的啊,能够保证我们所有的这1024个节点,同时如果在一毫秒内同时插入数据的话,它能够插入不一样的数据ID。好,那所以呢,这个是我们对这个分布式性能的一个保证,然后前面这部分的是我们对ID的这个时间顺序啊的一个保证,好,那所以整个的这几部分的内容呢,就。
05:00
组成了我们整个雪花算法。啊,所规定的这样的一个数据,那这个数据如果转换成整形的话,那么它是一个长整形,它占19个符号位的一个位置啊,所以这个大家可以看一下,它是19个符号位,你可以查一下123456,一共19个啊好,那这个。就是一个由雪花算法所生成的一个ID。我们管它叫。分布式ID啊,所以雪花算法呢,是分布式ID生成器的一种,市面上其实流行很多分布式ID生成器啊,就各种各样的算法,都是为了解决类似的问题的啊,既要保证它的顺序先后啊,又要保证它的这个不一样啊,又要保证他的这个并发对吧?啊,所以说呢。雪花算法是众多分布式ID生成器当中脱颖而出的一种算法,那么也被我们现在几乎所有的互联网机构啊,如果你要有这种这个分库分表啊,这样的一个需求的话,那么都会用这种雪花算法,那么雪花算法它的英文呢,叫snowflake啊。
06:16
Snowflake。Snow是吧,啊,Like是吧,雪花的意思好,然后那在我们的买Betty斯plus当中,它默认的主键策略就是学化算法,所以呢,大家可能会发现,呃,发现一个问题,就是在我们的t user里面。这个ID呢,我们并没有给他设置任何策略,但是呢,他也插进去了,而且呢,在我们的业务层当中,我们并没有去主动的。为ID设置一个值,但是呢,它也生成了,那这个呢,就是买be plus里面的雪花算法。所完成的,那这也是my business plus的一个默认的设置,那这个设置的话,如果我们主动设置,怎么设置呢?在这个位置。
07:08
有一个叫做at。啊,Table。ID的一个属性table ID这个属性呢,有一个值叫做tap啊tap属性呢。有很多的这样的一个。常量值,呃叫ID type ID type呢里面定义了很多预定义的值,这个里面呢,有一个叫做assign ID的,这个呢,就是我们的循环算法,好,当然了,这个assign ID呢,我们点进去看一下,它呢实际上是一个默认的啊,它是一个默认值。啊,是我们的。分布式ID当中的一个默认值,那这个默认值呢,它支持数值类型,所谓的number,就是它支持整形啊,长整形啊,但是一般情况下,我们会肯定是会用长整形来给它表示的,因为它生成的那个数据那么老长,就意味着你用整形是存不下是不是或者是字符串型啊,所以有的时候呢,我们啊,由于某一些业务上的需求吧,我们会把它定义成字符串类型那啊。
08:18
也是可以用这个ID的。明白吧,啊,所以说呢,这是学画算法哈,那么因为这个呢是一个默认值,所以呢,你是可以不写的。啊,这个是我们在业务层当中呢,自动生成的,但是业务层当中它具体的算法在哪体现呢?我们可以去看一看,它,比如说还是看刚才我们这个ID。然后呢,这块呢,他说。有一个默认的实现哈,它默认实现在哪叫做default identifier generator叫默认的,呃,这个。叫标识符吧,我们就给它表示为主键的意思,其实就是ID的意思啊,啊,默认的ID的一个生成器对吧?好,我们看后面这块是不是叫雪花算法呀,然后我们点进去看一下。
09:07
好,那这块呢,就是我们的默认生成器啊,我们的雪花算法的一个生成规范了,好,然后在这个生成器里面呢,有一个方法叫next ID,要下一个ID,那很显然这个方法呢,就是具体啊这个应用程序在执行的时候,它会走这个底层的一个方法,那这个底层的方法呢,它有一个。唯一的一个语句调用就是sequence序列next ID,那么很显然这个方法呢,就是具体生成ID的一个核心方法,然后我们点进去看一下。那么这个就要获取下一个ID,好大家来看。我把它往这边拖一下啊好,大家来看这块呢,其实你就多多少少的会看到雪花算法的痕迹,那么在课堂上呢,我就不给大家去呃,详细的去读这这个部分的这个源码了,呃,因为这也不是大家必须要掌握的,有兴趣的同学根据我刚才的查询的方法,你可以课下的时候呢,就看一看这个源码,那这个源码里面呢,就体现了雪花算法的核心思想,有时间戳部分,有数据中心部分,有机器标识部分,有序列号部分。
10:19
是不是呀啊,所以说呢,整个这几部分是如何生成,如何组成的,如果大家对这个算法感兴趣的话,你可以来读一下这个部分的源码,好,这个是有兴趣的同学啊,你的一个扩展的啊,一个知识点啊,你的扩展的一个可以去深入学习的一部分的内容。
我来说两句