00:01
各位同学大家好,下面呢给大家来讲解red应用中的另外一个问题,叫做分布式锁,首先解释一下分布式锁到底是什么,它能解决什么问题,给各位来说明一下,大家看我这段描述,就是我们原本进行系统部署,咱们用的都是不是都是单击进部署,而单击部署中,这里边比如说我们操作中,我可以为我这个操作加上锁,然后里边其他操作等待,等我锁释放之后,其他操作是不是能进行了,但是随着我们这个业务的发展,咱们的单机应用往往变成什么,是不是这个分布式或者说集群系统,而在分布式或者集群系统中就有问题了,比如现在我这里边有个分布式或者集群,然后我操作中,比如现在我对第一个这个机器,我们给他加了一把锁,那我加锁之后一个问题啊,这个锁是不是只针对我当前机器而。
01:02
而我这两台机器并不能得到这把锁,因为这个锁我这台机器在这个机器,这个机器是不是不认识,所以这个锁对我们所有机器就不能都有效,也就是里边我们描述到的。大家注意,这里边单体应用中你的锁生效,当你是分布式集群之后,这个锁不能生效,因为这里边我们的JYM不能跨这个系统进行锁的这么一个控制,所以咱需要一把锁,让我所有的这些系统都能认识,就咱通俗说的一个叫共享锁,是一个跨JM互式机制来控制的共享资源的访问,这就是分布式锁要解决问题,也就是说的通俗点,我现在上锁之后,那这锁对我整个集群分布制都有效,当我上锁之后,不管你下一个操作是在当前机器还是这个机器,还是这个机器都识别,只能等待当我锁释放之后,那其他操作才能往下进行,这就叫分布式锁,就是加一把锁,让我里面这些内容中都能共享,这把锁对所有这个机器都有效,这称为分布式锁,各位把这知道,然后分布式锁怎么实现?
02:15
性能我们来看一下啊。在实际中呢,实现分布式锁有多种方式,第一个是基于数据库直接实现,第二个基于缓存RA,包括基于组keeper等等,这些方式呢,各自有它的优缺点,我们这里边呢,给大家主要说明基于RA怎么实现分布式锁,那怎么做给各位来说一下啊,其实这个过程很简单,我们操作中呢,在read里边有个命令,不说各位是否记得叫set ex,这个命令就是针对分布式所操作一个命令,那我下面给各位咱们来演示一下,比如现在我先来一个,然后在里边比如来一个set NX,咱们加上一个K,这个K呢,比如说我就叫这个users,然后他的值随便写一个,比如这个人的这个年龄,咱来个时大家注意,现在我一回车这个值是做了设置,比如现在这个。
03:17
纸我再设置一次,20大家看。返回值是什么?是不是零啊,它就表示啊,我第一次设置的时候,这值可以设置,但是我第二次第三次再行设置,那这值就不能设置了,这里边用塞登S,好比说就加了一把锁,这个锁只有等它释放之后,你别的操作才能继续往下进行,所以这是它的一种方案,用set NX进行解决,这各位知道,比如说我们再试一个,这里边你看反应值都是零,它不能再往里设置,因为这里边已经加上锁,那这锁如果别人要设置,这锁是不是要释放了,那大家说我这个user这个锁怎么释放?
04:01
你说怎么做,其实很简单,我把它删掉是不是就释放了,比如现在我们来删除一下。Delete users删除之后,我们再来做个设置,大家看反应值是不是一了,当你是一的话,那可以做操作,而这里边当然别的操作只能等待,等你这个,比如我再释放别人是不是才能继续操作,这就叫分布式锁,在中一个最简单使用,用这个叫SNX把它做到。这个各位也都知道,也就是里边这个过程,通过sin s设置锁,然后这里边如果说你锁没有释放,那别人只能等待,当后你锁释放之后,别人才能够继续进行操作,而我们设置所用set NX,你释放所用DL进行操作,这是我们说的这个过程,这一过程举个比较现实点的例子啊,就好比说我们现在啊,比如说我这里边啊,举一个不太恰当,但是能说明这个问题的例子,比如现在我们去这个WC是什么,各位都知道啊,我们去WC的话,咱们打开门进入,把这个门是不是要给他上把锁呀,是不是给它锁上,我锁上之后,比如外边再要人来,他看上锁是不是要等待呀,等我这里边,比如我这个问题解决之后,我把锁打开,那这个人进入是不是可以做操作,而他进入之后干什么,是不是还要上锁,他上锁之后再来人,可能要等待,然后这个人出来之后别人进来再上锁,以此类推。
05:33
就好比说这个过程用SNX和DL把这个可以做到,所以各位把这知道啊。但是这个过程中呢,大家也可以想一下,你说我们目前这么做,他会有什么问题吗。啊,当然它肯定会有性能的缺失,咱先不考虑这个问题,咱考虑别的问题,大家说它会产生什么问题嘛,大家可以想一下,我现在每个人记入把它上锁,别人只能等,当我这锁释放之后,别人才可以操作,那我说下这问题啊,比如现在啊,我这人去厕所,我上厕锁,然后上锁之后我在里边啊,比如说我不注意我睡着了,比我睡了一天睡了两天,我这个人一直没有出来,那这锁是不是一直是锁的状态啊,别人是不是一直就不能进入,他是不是只能等待呀,所以这个肯定是不正确的场景,那这个问题大家说怎么解决,如果上锁之后这锁一直不释放,那别人永远不能操作,他只能等待。
06:33
那各位说这怎么做,所以这是我们要讲的这么一个问题啊,那给大家说一下,其实这个方案很简单,咱们上锁之后给锁是不是给他设置一个就是他的过期时间呀,比如咱们约定我去厕所,如果一分钟以内你没有出来,那这个时候比如做一些特殊行动,把锁给他砸掉,然后再进去,所以咱们可以顺着它的过期时间做到这个过程,那下面给大家演示一下哈。
07:02
比如现在我set NX user,咱来一个十,而这个时候已经上锁了,上锁之后呢,咱们设立下它的过期时间T,比如叫users,咱来一个十秒,然后通过TTL查看一下,比如它是八,它是这个六,包括这个时候呢,我们再设这个user色值肯定不可以,等它释放之后我们才可以,比如20,我们再操作是不是可以了,因为这个时候t TL user已经负一了,它已经过期了,就是可以设置它的过期时间,解决这个锁一直不能释放问题,这是我们的这么一个问题处理,所以这里边给各位做个说明,我在这图上给大家简单总结一下啊,首先里边的第一部分,咱们使用这个SNX可以给他就是。上锁或者给他加锁,然后咱们通过。这个叫DL,可以释放锁。
08:04
这是我们说到的里边的这个特点,然后在这个过程中呢,咱又说到了第二点,如果说我这个锁它一直没有释放啊,就是一直它是一个锁的状态,一直比如说忘记释放了。那这个时候我们可以怎么做呢?咱可以设置我这个K的一个过期时间,让它就是自动释放,比如说这里边呢,如你手动,那我释放了,如果你忘记手动,那它可以自动进行释放,所以这是我们提到的这么一个特点,各位把这个它知道。但是这个过程中啊,里边应该还有一个问题。不知各位是否能想到啊,它这过程中,也就是咱们的这个地方还有一个问题,什么问题呢?咱们之前啊,曾经提到一个词叫做原子操作,各位不知道是否记得啊,什么叫原子操作,就是两个是不是要一起进行,而这个时候,比如我现在这个操作应该不是原子操作,什么意思呢?比如现在我进去之后上锁,上锁之后,比如这个时候呢?啊,里边我们肯定要设置它的时间,比如现在我在没有设置时间的时候,我的服务器突然挂掉了,我这服务器突然断电了,那咱这个设置过期时间是不是就不能设置啊?所以里边会有这问题,当你把锁上完之后,现在突然断电了,突然出现了问题,那我这过期时间就无法设置,所以咱们可以怎么做呢?给大家写一下啊,就是里边的第三种情况。
09:37
在我们上锁之后,它突然的出现了异常,出现问题,那这个时候咱就无法。设置它的过期时间了,那这个时候怎么解决呢?给大家说一下啊,其实做法很简单,咱们就是一边上锁的时候就同时设置它的过期时间是不是就可以了,就是我上锁的时候归时间就一起设置了,那这个问题就能解决,那我们来设置给大家来演示一下啊,比如现在我们先看一下这里边值啊,他应该已经示范了啊。
10:15
然后现在我们做法就是咱加一个赛。Users加个值,在值后面呢,加个N表示对它上锁,然后再加个叫ex,表示就是过期时间,就是一个简写,在ES后面加上你那个具体时间,比如咱是这个。呃,咱为了区分啊,比如说来一个12秒,这样的话,我们就是既上锁又设置的过期时间,那比如说咱们回车,我先用这个PTL等于看一下啊,里边这个users,然后里边这个值。啊,那我们看一下啊,是不是哪里写错了啊,咱们把这个值,比如给它我先删除一下啊,Users啊,给它先删除,然后咱重新设置set user10加个NX,就是表示它里边给它上锁,就是SNX嘛,然后加个ex,设置它的过期时间,咱们回车,然后这个时候呢,我用TTL查看user是不是九秒,我这个时候呢,再来设它的值,比如说user这个20是不是就不能设置进去,所以现在咱们通过这个过程就是D上锁,又设置了它的过期时间,比如说我们再查看里边应该已经过期了,然后现在咱们给它再做个设置set NX user,比如说30,这是不可以了啊,所以咱们用这种方式进行解决,既上锁又设置过去时间,让他们同步进行。
11:50
各位把这个给他知道,所以这是我们针对分布式所中的循环操作,给各位就做了一个说明,然后把它给大家再总结一下啊。第一个各位知道分布式所解决什么问题,就是你在分布式集群中,如果你上锁的话,在单机版中咱们可以实现,但是在我们集群分布式中,你这台机器上锁,另外的机器它应该找不到或者不知道这里边已经上锁了,所以咱们用一种锁让所有机器都能认识,比如咱通俗说那个叫共享锁,那共享锁怎么做呢?里边有多种方案,咱们用的是RA进行实现,做法就是通过set NX进行上锁,上锁之后用delete来释放锁。
12:35
但是这个过程中呢,如果说你上锁之后,你忘记释放了那锁,它就一直没有释放别的操作只能等待,所以咱们可以设置这个key的过期时间,你可以手动释放,如果你没有手动,它会自动完成,而这过程中因为它不是原子操作的,加上它变成原子操作,怎么做?我在上锁的同时设置过期时间,让上锁过期时间一起进行,用set ex NX同时操作,这样的话把这问题就做成了原子性操作。所以这是我们关于分布式锁的基本的演示,各位把这特点给定,要知道什么叫温不知所,包括在ready中该怎么进行操作。
我来说两句