00:00
在数据库当中会有这样的一类表,叫做字典表,字典表当中存储的数据呢,例如学历信息,比如说专科、本科、研究生、博士等等,还有像我们做医疗系统的话,有医院的级别信息,三甲医院,三乙医院等等等等,还有呢,我们的身份信息,比如说我们在登记个人信息的时候,有的时候会选择身份证,有的时候会选择护照等等,还有呢,比如说民族信息,中国有56个民族,每一个民族的名字好,我们都会配置在这种字典表里面,那你会发现呢,字典表里的数据,它的数据量不大,而且呢也不会经常发生变化,但是呢,它貌似和我们应用程序当中每一个业务呢,都多多少少会有一些关联关系,所以说呢,这种表呢,它应该和每一个表呢,都能进行关联操作。那么如果我们的数据库做分片设计了,做分布式设计了,那这种字典表应该放在哪个数据库当中比较合适呢?因为我们说它会和所有的表和任何一个表都可能会产生关联操作,那我们呢,会把字典表放在所有的数据源节点上,那也就意味着这种表呢,它会有多份,我们管这种表呢叫广播表,那么广播表呢,有下面的这样的一些特性,插入更新操作会实时的在所有的节点上执行,保持各个分片数据的一致性。
01:35
查询操作只从一个节点获取,可以跟任何一个表进行join操作,好这个就是广播表的特性,我们现在呢就来创建一个广播表,那这个广播表呢,我们就给它起个名字,就叫字典表,叫T。在server order0和server order以及之前我们的server user服务器当中,我们呢分别创建字典表,这个字典表呢,我们设计的比较简单啊,只有两个字段,一个是ID,一个呢是字典类别,当然了,实际情况呢,这个字典表呢,可能要更复杂一些,那么我们现在呢,就把这个字典表呢给它创建出来。
02:18
那这是SERVER0数据库,我们创建这个字典表。好,这是数据库,我们创建这个词典表,另外在我们目前为止的应用程序当中,实际上呢,它还有一个。啊,我们也是一直运行着它呢。所以呢,我们在这个里面呢,也创建字典表。先选中一下,然后创建字典表好。那ICT?TT。TT,好,那么在这三个数据源当中呢,我们就创建了三个字典表,这个呢,其实就是刚才我们提到的所有的分片数据源中都存在的表,就是这个意思。
03:13
好,接下来呢,我们在应用程序当中为字典表呢,去创建相应的实体类,叫dictt,那么date的实体类里面呢,我们定义两个属性,这两个属性呢,一个呢是ID,那这个ID呢,我们就使用my plus的雪花算法吧,所以这地方我们就配的是ID哈,然后呢,这面呢,我们使用的是啊,上面这个地方指定的是应用程序当中的逻辑表明,好,我们先把它创建出来。在entity当中。内容呢,我们直接复制过来吧,因为它呢相对来说还比较简单。然后接下来呢,我们来创建。
04:03
在map包当中。添加dit matter。好,这块呢,应该是个interface。我们让他继承base。蛋形呢,写上面呢,添加一个map注解。然后接下来呢,下一个任务我们就是要配置广播表了,那么广播表如何配置呢?这个地方叫广播表规则。我们把它配置在。配置文件中这个位置。那在配置这个广播表之前,我们把这个也先复制一下。叫绑定表好。
05:01
那我们在这个地方配广播表。广播表规则列表,那我们现在广播表呢,就一个,所以呢就T就可以了,那当然了。广播表的T这个数据节点呢,我们。配在上面这个位置。来这。那这块呢,我们写。TT。啊,实际的节点呢,是在server user当中有一个T,然后呢在server order0和SERVER1当都有T,所以这个地方呢,我们写和一当中。
06:08
都有TCT,另外呢,Server user这个数据源当中也有七好,这是我们的节点的配置。那接下来呢,我们就可以对广播表进行测试了。我们找到。之前的测试用例test还是写在这个里面吧,我们来测试一个广播表的插入test。Insert广播表呢叫broadcast,就刚才我们配置的过程当中这个单词。叫broadcast。所以呢,我们就写insert broadcast。
07:05
好,我们创建一个new dict对象,那Di呢,我们写set type这里面我们随便写一个就行了,比如说TYPE1啊,没有什么实际的意义啊,就是单纯的为了测试一下广播表,然后呢,Date map,我们需要把date map呢先注入进来。所以这块呢,就是dit map.insertt好,我们呢做了一个数据的插入的工作,我们要验证的是看一看是不是三个数据源当中都同时插入了这条记录。
08:13
好,那你会发现呢,逻辑circle呢是做了一个插入操作,但是实际circle呢是分别向server user以及server order0,最后和so order1当中都插入了,记录好,那这是我们的SQL语句,那我们来看一下实际的情况。在。Serve order0中,我们看到了表中的这条记录。那么在serve order。一中我们也看到了中的这条记录,最后呢,在server中我们也看到了中的这条记录,而且呢,你会发现这三条记录的ID呢,也都是一样的哈,所以他们其实呢,就是数据副本了,就是同一条记录,这样的话呢,假设说。
09:02
我们user要和T做多表关联的话,那么呢就避免了跨库关联,同样在这面,如果t order,还有order item想要和这个字典表做关联查询的话,也会避免跨库关联,同样这个地方和他做关联查询的话,也会避免跨库关联,所以呢,广播表的作用大家现在呢应该也清晰了,就是这个表呢,和所有的业务数据库当中的所有的表呢,貌似都多多少少呢有一些关系啊,有一些关联查询的关系,那这种呢,其实就是字典表啊,所以一般情况下,在我们的业务当中,字典表就是作为广播表来配置的,好刚才我们做的呢,是一个插入的操作,最后呢,我们再来做一个查询的操作。这个是广播表插入测试。
10:00
然后我们再来做广播表查询测试。Select broadcast。那我们直接用map点。Select查询所有的记录好,那么我们会得到一个list。我们把这个呢做一个输出。那么我们来运行一下。好,我们来看一下。那你会发现呢,它的逻辑circleq就是我们写的这种,然后呢,它的实际circleq实际上呢,只从一个数据源当中进行查询,那他也没有必要从其他的两个数据源当中进行查询,因为三个数据源的数据其实是一模一样的,所以他根据随机负载均衡规则,从其中的一个数据源当中查询记录。
我来说两句