00:00
前面呢,咱们已经基于redis和zoo分别去实现了我们的分布式数。那我们这里的话呢,来讲第三种分布的实验方式啊,咱可以基于my circle这种关系型数据库,关系型数据库,那么来去实现分所。那么这个MY这种关系数据库啊,该如何实现分钟所呢?那么实现思路什么样子的?那其实呢,我们可以借鉴之前RA和zoo keep的实验思路。那么RA和zoo keep分别是基于什么样的原理来实现的呢?啊,RA啊,我们是基于。啊,K的唯一性啊,来去做到独占排他的。啊,不能重复。那么然后呢,咱的the keep里面,我们是基于they no的节点不可重复啊,或者说唯一性啊,来一做到独占排查的。
01:03
那我们在my circle里面。啊,怎么做到独占排他呢?那这是锁的最基本特征啊,我们需要去保证。那么啊,咱们在MYSQL里面啊,有一个叫唯一见索引的啊这样的一个概念。哎,我们可以利用违键索引这个东西啊,那么来去实现咱的独占排查使用,因为违一键索引啊,也是不能重复的。啊,具体的玩法什么样的呢?哎,我们可以结合咱具体的表,我们来去看一下啊,该怎么去实现啊,实现方式呢,其实我们很简单,咱们首先要有一张表,那这张表的话呢,就是咱专门为分布所设计的一张表啊,那我们来去新建一张表。那这张表呢,咱不需要很复杂,我们只需要有这么两个字段就可以了,那么一个呢是ID,然后再来一个big int类这个类型的数据,然后我们再来一个部位空的,然后呢是自动递增啊组件,然后呢自动递增啊这样子。
02:05
啊,把这个勾上之后呀,再去啊添加一个栏位,那么然后呢,我们还需要锁的名称啊这样子。那你不同的锁呀,锁的名称是不一样的,那我们就可以做到相互之间不会有影响。那所与所之间不会有影响,那么锁内部的话呢,咱是争抢关系啊。那么然色素的长度啊,咱们可以指定为比如说50的长度,然是肯定不能为空的。好,那我们这样的话呢,咱就已经设计好这张表啊,那表的名称我们可以来一个TB是lock啊这张表。啊,表设计好之后呀,那我们,呃,后续我们怎么去实现分布式所呢这张表,哎,我们还得要给这张表吧,来设计一个五一键索引。好,在这里呢,给它索引啊,起名字我们来一个I DX unique,让栏位呢,咱们肯定是对针对lock name这个栏位能么来设计。
03:06
那么以及索引类型,我们可以设计为UN类型。啊,唯一键索引让它保存一下好,那么这样的话呢,唯一键索引啊,已经设计好了。那么设计好之后呀,比如说呢,我现在要向这张表里面来插入数据啊,它肯定是insert,然后into啊TB,嗯,Lo这张表,Tblo这张表,那么然后呢,我要向里面来去指定咱们这个。啊,Lock name啊对应的这样的一个啊信息来插入啊,这个这样的一个列啊,来插入数据,那么然后呢,是啊values,我插入什么东西呢?比如我插入一个呃,所的名称啊,咱们给它起个名字嘛,叫lock。所名称就叫lock。那么假如说啊,我同时有100个请求来以执行这个CQL语句,那么只有几个可以成功的电影只有一个可以成功。
04:05
因为我这个lock name是一样的。啊拉是一样的啊,注意拉,Name不一定要一样。好,那么啊,由于咱是违键,所以所以呢,这100个请求只有一个可以成功,你看此时呢,影响条数是一啊,执行时间呢是0.00004秒啊,说明呢,已经执行成功了。那么我们的表里面就会有这样一条数据啊,我们可以看一下也已经有这条数据了。那么已经有这条数据的情况下,那么后续请求在一执行这个社会局的时候还能成功吗?哎,就不能成功了,他违反了我们的违见索引,具体思路呢,是这样子的啊,假如说呢,我们有100个请求,那么同时来于执行这个SQ语句,那么只有几个可以成功的啊,肯定只有一个可以执行成功。那么这一个执行成功了的就相当于回到所了。那会调所之后呢,它可以执行业务操作,那么执行完了,然后再去释放锁,把这条记录给它释放掉,我们直接给它删掉就可以了啊底类的操作删掉。
05:10
那么删掉之后呢,就相当于释放的要素啊。那么其他没有获取或者没有执行成功的啊,这些请求怎么办呢?这些现象怎么办呢?咱们可以进行重试。啊重置,那么等我这个治疗记录删掉了,那么后续请求呢,或者后续线程啊,它就可以呢,重置成功,那么既然呢,诱惑一道锁来执行业务操作执行完了呢,再去删掉,那么周而复始这个样子。那最终呢,所有请求啊,都可以获取到,所。它资源整体的一个啊分析思路,那么这个思路呢,我们可以呢,用文字来记录一下啊,那么在基在MY思库里面,我们要去实现分布索,那么实现思路是这样的一个思路,那么首先加速该怎么去操作呢?我们要执行这样的一个insert这个SQ语句啊来去获取所如果执行成功就代表呢,获取所成功啊,那执行成功代表获取所成功,那否则呢,就会有所失败。
06:16
那获取锁成功了的,那咱可以去获取所成功的这个请求,可以执行业务操作。那么执行完了,哎,咱们可以呢,执行完成之后,咱可以通过be delete这样的一个随口语句来去删除对应记录,就相当于它相当于我们就释放锁了呀,啊释放所。好,那么然后呢,咱啊获取所失败的请求啊,肯定会抛出异常,那我们可以进行重试就可以了,那怎么重试呢?咱们可以就可以使用递归啊啊或者使用循环,那这个的话,咱肯定要使用递归啊来进行重试啊。
07:03
好,那么思路我们已经分析好了,那具体怎么落实到代码上面去呢?好,咱接下的话呢,就用代码来实操一下。
我来说两句