00:00
好,那我们刚才呢,是讲了table ID这个注解的一个用法啊好,然后下面呢,那我们之前咱们一直在说雪花算法,那什么到底什么是雪花算法呢?首先呢,咱们就要来聊一下我们雪花算法的一个背景。那大家都知道吧,然后随着我们当前,然后咱们数据规模的增大,那我们首先需要来考虑的问题啊,就是我们当前的一个数据库的访问压力,以及我们数据量的一个处理好,那我们就要来扩展我们数据库的性能,那这个时候我们要想来扩展数据库的性能的话,那我们都一般情况下都有哪些方式呢?比如说我们有业务分库,咱们有主从复制,然后有数据库分表,那我们在这儿呢,主从复制大家应该都很熟悉,对吧?也就是说在主从复制中,咱们能保证主服务器和从服务器的数据是一致的,而主服务器实现写的功能,从服务器实现读的功能,所以说它主要来实现的就是一个读写分离的操作。好下面呢,我们就以我们的数据库分表然后为例,咱们具体的来说一下,首先呢,大家来看数据库分表,其实就是将我们不同业务的数据分散存储到不同的数据库服务器中。然后呢,我们。
01:15
能够支撑百万甚至千万用户规模的一个业务,但是大家想如果随着我们当前业务的一个发展,然后我们当前这张表中的数据呢,然后会越来越多,越来越多,直到他达到我们当前单台数据库服务器的一个处理瓶颈,对不对?就比如说我们淘宝的几亿个用户,他肯定不可能存在于我们一个数据库里面的一张表中啊,对不对,那这个时候我们就需要对我们的这一张表来进行一个拆分,那怎么来进行拆分呢?我们拆分的方式一般有两种,一种呢叫做垂直拆分,第二种呢叫做水平拆分,那垂直拆分的话,大家应该都很熟悉。大家应该也都能够听明白对吧?垂直拆分大家想想是怎么拆的。
02:02
比如说我们现在咱们有这样的一张表,然后在这张表里面咱们的有些字段呢,然后是经常会用到的,而有些字段咱们是用不到的,比如说我们现在这就是一个用户的一个表,然后name表示我们当前用户的名称,A表示用户的年龄,Sex表示用户的性别,然后nickname表示的是用户的昵称,还有description表示的是我们当前用户的一个描述,比如说我们现在咱们有一个婚恋网站,哎,这个好多同学都应该访问过,对吧?好,然后我们当前用户再去筛选我们所需要的一些信息的时候,其实他只在乎什么年龄和性别。对吧,这个大家应该都能想明白对不对?好,然后所以说对于我们当前的一些昵称啊,以及描述呀,然后是不是我们当前所需要查询数据的一个重要信息呢?不是,所以我们就可以通过垂直拆分,将我们不需要用到的一些数据,或者说不重要的一些字段,将它拆分到其他的表中,好,这个是我们的垂直拆分,那什么叫做水平拆分呢?因为大家都知道,在一张表里面,根据我们数据库性能的不同,然后咱们的一张表啊,然后他要想发挥出来它最好的一个性能,最大的性能,我们的一张表里面是不可能会无限制的去存储数据的,那这个时候我们就可以来规定一下,咱们的一张表最多可以来存储多少数据,然后以达到它的一个最高的性能。比如说大家来看。
03:33
好,然后呢,有的公司呢,要求咱们的单表行数超过5000万,就必须要进行分表,当然这个数字呢,也不是一定的,就比如说我们当前咱们的这个数据库性能非常的优秀,那可能我们就会超过1亿个,或者说我们当前这个表里面的数据非常的简单,那这个时候咱们的这个数据可能会更多一些,才会进行分表,但是如果我们当前表中的数据非常的复杂,可能超过1000万,咱们就要进行分表了,OK吧,这样的,好,那我们该如何来进行一个水平分表呢?水平分表是将咱们一张完整的表中的数据分到多张表中,那这个时候我们都有哪些方式呢?比如说咱们可以来使用一个主键自增,对吧,那怎么来实现?很简单,比如说大家来看,我们可以这样,我们可以按照一个范围来进行分表。比如说咱们在。
04:27
这个100万的范围之内,然后咱们把它放到一张表中,然后呢,把咱们的这个从100万,然后到1999999放到咱们的第二张表中,然后以此类推,那这样可不可以可以,但是呢,大家来想,这样其实他也是有一些问题的,比如说。我们当前分段大小的一个选取,太多了也不行,然后太少了也是不行的,当然它也是有优点的,就比如说咱们可以随着数据的增加平滑的进行扩充,比如说我现在呢,我的数据更多了之后,它并不会影响我们之前所存储的数据,我们只需要在原有的基础上再去扩充一些新的表就可以了。好,当然它还有一些缺点,就比如说我们当前分布不均匀,比如说我们的数据一共是100万,然后零一条,对吧?那这个时候是不是有一张表,它存储的就有100万条数据,而咱们的另外一张表中就只存储了一条数据,对不对,这样的啊,所以说是分布不均匀,那当然呢,我们还有一些其他的方式,就比如说取模,那什么是取模呢?大家应该也都能想到,比如说我们现在咱们来找到一个数字,咱们就找到一个十,然后把我们当前咱们的这个自动递增的ID啊,然后除以十,再把它放到。
05:47
平均放到我们当前的几张表中,比如说我们准备了十个数据库,然后把我们当前咱们的这个ID呢,然后除以十,根据它最终的一个模的值,然后呢,再把它放到相对应的数据库中,比如说我们模上十之后,然后我们最终的结果是五,就放在我们五的这张表中,如果说我们当前是10086,那咱们磨完十之后的结果就是六,那咱们就把它放到编号为六的这张表里面啊,这种方式也是可以的好,当然呢,它也有一些复杂的,复杂的地方,比如说我们当前初始表的数量的确定,如果太多了的话,那咱们可能每一张表里面放的数据都很少,而如果我当前判断,就如果说我当前判断的不是很准确,我的表如果太少了,那我们可能每一张表中存储的数据呢,就有很多,那就达不到我们分表的一个结果了。
06:43
好,当然它也有一个优点,就是我们分布的比较均匀,因为我们是通过膜值,然后来进行的分布,所以说分布是非常均匀的啊。好,再往下缺点的话,大家想想,那如果我们现在咱们根据我们之前咱们的分表没有达到我们预期的效果,比如说我们分的表太少了,我们就分了五张表,结果太少了,我现在需要分十张表,那这个时候大家想你能仅仅仅仅是去添加一些新的表就行吗?不行,因为我们取的是模值,那所以说这个时候我们就需要将之前所有的数据全部都重新再进行分布,OK,这个大家注意啊。
07:23
好,那最后一种就是我们的雪花算法,那雪花算法是由推特发布的,对吧?然后呢,大家注意它非常适合使用在我们的分布式的架构里面,大家看到它的特点能够保证不同表的主键不重复性,那也就是说我们通过雪花算法所算出来的这个ID,就算我们是在不同的表里面,它也是不会重复的,还有就是相同表的主键的有序性。那大家还记不记得我们之前咱们在测试我们的添加功能的时候,然后它都会随着我们的时间,这个ID是越来越大了,所以说它是跟我们的时间是有关系的,所以大家注意相同表的主键的有序性指的是什么意思?我们后添加的数据的ID1定比之前通过雪花算法算出来的ID是要大的,OK吧,好,再往下大家来看它的核心思想,其实就是我们当前咱们的雪花算法算出来的这个ID的一个结构,第一位它一共是多少位呢?64位,第一位呢是标示符来标识,它是正数,然后其中的41位,然后来表示的是一个时间戳,然后再往后的十位,然后是我们当前机器的一个ID,然后再往下的12位,然后是我们作为毫秒内的一个流水号,大家可以看一下我们当前通过雪花算法所算出来的ID,一般情况下。
08:50
它一定是不会重复的,这个大家可以放心的使用,所以说呢,那雪花算法这个大家可以简单的了解一下就可以啊,不用深入的去研究。
09:00
好,所以说最终我们总结出来咱们的雪花算法的一个优点,整体上是按照时间自增排序,然后呢,整个分布式系统里面,它不会产生相同的这个ID,而且效率非常高,所以说在我们以后,就像是我们现在咱们进行测试的时候,我们的ID有可能都是使用的自动递增这种方式,对吧?但是在我们以后真正开发的过程中,在我们的分布式的系统里面,我们来使用咱们的雪花算法,其实也是一种非常好的一个,对吧。非常好的一个用法啊,这个大家注意。
我来说两句