00:00
现在呢,我们已经基于my circle来去实现了我们的分布数索,那么接下来呢,我们来去对比之前我们的red以及cable的分布数索,那么来去比较一下我们的MY斯个分布之所还有哪些问题没有解决,那么又该如何去解决?那么这的话呢,我们只提供思路啊,不提供具体实现了啊,因为呢,我们可以发现MYSO的分布索的性能存在严重的问题。那么非常的垃圾,好,那么这的话呢,我们来去分析一下,首先呢,来结合来看一看,那么它还有哪些问题没有解决,那么又该如何去解决。那么首先第一个啊,咱分的特征啊,就是独占,独占排他互斥使用啊,独占排他啊互斥那么使用,那么这个东西呢,咱已经实现了,那我们是借助于唯一建违建。索引,那么来去实来实现的。
01:00
啊,那么然后第二个特征呢,呃,我们要去防死锁,那防死锁呀,在release里面有两种情况可能会导导致搜索,那么第一种情况啊,是客户端程序获取到锁之后啊,服务器啊,服务器宕机,那可能会导致搜索,那么是咱的客户端啊程序的程序的服务器宕机可能会导致搜索。那么这的话呢,我们在red里面啊,当然是借助于过期时间来以防止搜索的。那么在我们的MYSQL里面,那该怎么做呢?那比如说呢,我们已经成功的通过音色的音into来加锁成功了,那加锁成功之后呢,然后呢,服务器宕机啊,服务器一旦宕机啊,咱就没有机会来去释放这把锁了哈。啊,那么咱这呢。我们可以通过给咱们的锁呀,给咱们的锁呢,来添加一个时间列。
02:03
啊,比如说呢,我们可以在这个地方啊,再添加一个栏位啊,添加一个锁定时间啊,获取锁的锁定时间这样一个栏位啊,来一个time。然后time家呢,是不为空。啊,这样的话呢,我们每次获取锁的时候呀,同时呢,给这个字段啊,指定一个你获取锁的当天时间,这样的话呢,我们就可以根据啊咱们的系统发电时间,可以检查一下这个货取所的时间啊,是不是已经啊远远高于某一个值了啊,如果高于某一个阈值的情况下,那咱就可以呢,把这个所呢给它释放掉啊,说明它长时间占用所能力有释放,那咱可以呢给释放掉。那通过定时器呢来检查就可以了。导致咱们这样的一个啊防死锁,第一种情况啊,咱们可以呢,给啊锁记录还添加一个,添加一个获取所时间啊,这样的一个列啊,就可以去实现了。
03:05
啊,那么然后呢,第二种情况就是不可重入啊,也可能会导致搜索,那我们让它可重入不就可以了吗?那怎么可怎么重入呢。好,那我们可以这样的啊,咱们呢,可以呢,再去添加啊两个栏位,那么首先呢,我可以给呃,咱不同的服务,先分配一个服务啊服务唯一标识,比如咱可以来一个啊server,嗯,ID这样的一个字段。那我们可以在服务器启动的时候呀,然后呢,通过UID啊,或者是通过某种方式给咱这个服务器呢,生成一个唯一标识。那这个唯标识呢,可以是rar类型的,那么也可以呢,是数字类型的啊,那比如说呢,我们这里就使用字串类型的,比如你可以生成个UID啊代表呢这台服务器。那么同时的话呢,我们也可以记录是这台服务器的每一个线程获取到索,那咱于此还可以去记录啊线程ID。
04:02
那么线程ID啊,咱应该都是int类型的啊OK,那么然后呢,啊主为空,那么下来呢,我们在获取所的时候呀,啊,咱们可以检查一下当前所是哪个线程,哪个服务器的哪个线程获取的。啊,如果是同一个线程,同一个服的同一个线程获取的,那我们呢,就可以进行重录,那同时呢,我们还可以去记录一下这个重录次数。啊,比如说呢,我们可以去来一个count这样一个字段来记录总次数啊。那么当重复次数减为零的情况下啊,我们就可以呢,把这条记录给删掉,那否则的话呢,我们只要去更新count这个字段就可以了。好是咱们这个可重录锁啊,那么可重录锁呢,我们,呃,后续啊,咱们肯定也是有可重录索这个特征的啊。好,咱们可以借助于啊,那个季度服务服务信息,服务信息那么及那么线程信息还有啥呢?还有这个重入次数。
05:06
啊,通过记录这些信息,那么然后呢,以实现咱们这个可重入锁。当然呢,在实验过程中啊,我们可能会使用到呃,MYSQ自己的一些悲观锁,然后呢,是保证。保证咱们这个原子性,保证这个操作的一个原子性。啊,那么第啊三个特征啊,第三个特征,那么就是我们要去嗯,防雾塞防雾塞,那我释放手的时候会会不会把别人的手给释放掉呢。那我们这块呢,其实呃,可以走到房屋三啊。那我们呢,呃,再去获取锁的时候呀,咱们去新增啊,是新增一条记录,新增一条记录的时候呢,同时咱们可以读通过组件回写那获取治疗记录的ID。那么这个呃ID啊,它是自增挡的啊,那你每一次获取锁的时候呢,你只要没有重置过这个自增的这个起始点啊,它是不会重复的。
06:04
那这样的话呢,我们释放所数呢,是根据这个数的ID来释放的,那所以的话呢,咱们这个误删啊,是已经解决了啊,咱们是借助于。借助于然后是ID的这个唯一性,呃,来去防止误删的,咱们已经做到了。好,那么第四种情况。啊,咱们要去保证什么呢?保证原子性啊原子性那目前为止呢,咱这个其实是可以保证原子型的,那么因为呢,我们这个呃,插入记录获取锁是插入一条记录,那么解锁呢,是删除啊,根据ID删入一条记录。那么不管是你插入一条记录还是删除一条记录呀,它本质是一种写的操作,那么写的操作呀,在我们的这个MY库里面,它会自动开启一个事物。那么事物的底层啊,其实是通过所可以实现的啊。
07:00
那我在写的,嗯,在我这个事物结束之前啊,那其他事物是不可以操作的啊,这个是可以保证原则性的。啊,这块呢可以保证原则性,那我们呢也已经测试过了,在高并发情况下没有任何问题。那么如果你要去做到这种可重入啊,可重入的话,那我们的枷锁呢和解锁呢,可能就没有这么简单了啊,可能是一个词后语句啊,搞不定的那么一个一个写的操作搞不定,我们要要去配合更新啊,或者是查询那么来进行操作。那么此时呢,咱们可以呢,借助于MA1思的悲观锁来来做的,还能做到这个原子性啊。好,那么我们这个原子性的保证啊呢,通过一个啊加速和解锁,通过一个写操作啊,就可以保证原子性,那如果你是多个操作的话,那么咱可以借助于啊,还可以借助于这个my circle的非关锁。啊,来约时间。OK,那么是他啊,或者是乐观所嘛,对吧?啊都可以啊,那么然后呢,是第啊五种啊,第五种特征,第五个特征啊,那么咱的red呢,还有这个可重入,那么可重入呢,刚才已经分析过了,我们只要去记录获取所的这个服务信息,那就是服务ID嘛啊四发ID以及线程信息,就那个线程ID。
08:23
那么还有这个重复次数,那咱就可以做到这个可重读了啊。啊,那么然后第六个特征啊,就是这个自动续期啊,啊自动续期。那么这个自动续期呢,其实呃,我们也可以做到啊,那咱们通过一个定时任务啊,来去判断这个锁是否过期。那同时的话呢,我们也可以通过这个定时器啊来检查呢,来一自动续期的啊A自动续期。当然的话呢,这个呢是嗯不太好做,当然这个定时任务呀,呃,这个自动续期定时任务的话呢,咱可以在服务内部来预习。对吧,那释放锁防止误删的啊,防止防止这个死锁,这个定时定时任务呀,咱可以呢,搞一个独立服务来实现。
09:07
所以这必须得是一个独立服务才可以啊,才可以防止,才可以防止搜索就是服务器宕机来的搜索啊。OK,那么这个自动续期的话,咱可以在服务内部来完成。啊,如果我们。啊,这个呃,这个呃,应用程序啊,没有等级,那么可以呢,随时的去重置你这个获获取所的时间。那大要重置为当前时间就可以了。那么一旦我的服务器宕机了,那我每次就无法去重置这个所得所得这个获取所得有效时间了啊。那么既然的话呢,它那个独立的那个定时器啊,那它就可以判定为啊,判定为这个它无法去更新,那就会导致呢,这个定时啊,就可以判断出啊,它这个时间和系统的延时间的。啊,这个误差呀,或者说这个差额呀,就超过阈值了,咱们可以把这个锁呢给释放掉。
10:01
啊,这是两个定时器啊,那么此时呢,咱可以在使用服务器内的定时器,那么来去。重置重置获取所的这样的一个时间啊,系统时间,系统时间。那么然后的话呢,这个的话呢,咱这个定时器啊呃,定时器的话呢,我们得通过额外的服务外的一个啊,服务外的或者额外的这样的一个定时器,那么来检查检查。我们这个获取所得系统。破解所得系统时间,那么和当前系统时间的这样的一个差值啊,那么是否超过了,超过了某一个阈值,如果超过了某一个阈值,那我就可以自动把它给删掉了。
11:02
那这样,这需要一个额外的。啊,定时器啊,那这个定时器的话呢,不能在我们的客户端程序里面。那它需要一个独有定时器。啊这样的啊,那所以的话呢,还是相对来说呢,比较麻烦的。好,那么然后第七个问题就是咱们这个单机问题,以及呢,急性情况下。而为所失效呢?好,那么首先呢,是单机问题啊,单机问题,那么这个单机故障问题呢,我们可以搭建。啊,咱可以选择搭建MYSQL的这种主备啊主备,但是我主服务器挂掉了,然后还有备用服务器给顶上去。三的话呢,咱可能会面临着,嗯,面临着这个机群情况下,那么所机制啊失效这个问题啊,那这个问题话呢,依然是存在的啊。那比如说呢,我这个主服务器挂掉了。那么这个备用服务器可能还没同步出去呢。
12:02
然后呢,他就已经,呃,就已经挂掉了,对吧?啊已经挂掉了,比如我这个组的话呢,我一个我一个客户端程序从组里面获取到锁了。会量锁之后呢,那么它那个备用服务器呢,还没来得及同步数据呢,然后呢,那个主服务器就挂掉了,那于是呢,我备用服务器开顶上去,顶上去之后的话呢,那另外一个线程就可以立马获取到一个新的锁。那么此时呢,会出现所及之失效啊?那这个问题的话呢,是啊,不太好解决的。啊,就咱们这个东西。那我们再去对比那个题外的分热素。那么左people分布所呀,多了一个啊,多了这么一个特征,就那个主厕所啊,主厕所,那么这个主厕所呀,在MYS里面的,嗯,也不太好去实现。
我来说两句