00:00
通过前面学习我们可以发现,要保证共享资源的线程安全,那我们只能去在应用程序级别使用JVM为例,锁以及呢,根据共享资源存放的位置来选择对应的所基值。那么在抓利的时候,那我使用这用本地锁,它只能是单机情况下才能去使用啊,单机单立的情况下。如果我使用release乐观锁的话,那么性能呢又得不到保证,那么此时呢,我们怎么办呢?我们可以再回到代码级别。那么然后呢,利用分布式锁来以解决。啊,两账分布式锁呢,我们就要去好好看一看了,那么分布式锁呢,是针对GM本地锁那一说的。那本地锁呀,它只能解决一个服务内部的共享资源的并发使用问题,而我们的分布式所还可以做到画进程,那么跨服务甚至是跨服务器,那么来保证我们的并发使用。
01:06
那么之前呢,我们的本地锁,它只能解决一个服务内部的啊。哎,如果我是集群部署,他可能就搞不定了。那么特别是我们的共享资源在red这种no circle数据库里面的时候,对吧,我们的库存呢,在这个里面的时候,那red还好可能有乐观所机制。那么更多的no数据库可能压根呢,连乐观所机制都没有。而我们的服务呢,又急停部署了。那你使用GM锁呢?肯定就不行了,我们交替使用分布式锁。那么它就可以做到跨进程,我这个服务呢,可能是放在同一台电脑上的。只是呢,它属于两个不同的进程而已。那么也可能呢,是放在不同的服务器上面的。那么此时怎么做到啊排他使用呢?
02:01
啊,那么分布式组呢,就可以做到。所以咱们分布所的应用场景,那么其实也很好理解啊,那么它的场景呢,其实主要是两个场景啊,可以去分析一下。那么哪两个场景呢?一个是超慢现象,超慢现象,那么还有一个呢,是咱们的缓存缓存那么积分啊,这两个呀,也是使用分贝数最多的了啊。OK,那么咱们来看一下,首先是超卖看一下,特别是我们的库存在no circle这种数据库里面的时候,那么我们往往呢,选择性并不多,那么分分损呢,一定是最佳选择之一了啊。那么然呢是缓存气穿,那么缓存气穿啊,哎,咱们呢,有些同学可能就了解过。啊,你只要玩过缓存,都应该了解过缓存的三大现象,一个呢是缓存的什么穿透,那么还有缓存的什么雪崩,以及缓存的击穿。
03:05
那么前两个现象呢,咱就不解释了啊,咱们解释一下这个缓存击穿。那缓存计算怎么回事呢?啊,咱这样子的要了解缓存计算,我们都要去了解缓存,那么缓存是干什么的呢?那缓存啊,其实它可以提高我们的访问性能。那比如说呢,如果我们的所有请求都直达MYSQL数据库的话,那可能会带来两个问题,那么一个是性能问题。因为myc控它是一种放在硬盘上的一种数据库啊,它属于文件型的数据库。啊,文件型数据库。它可以支撑很高的数据量,因为它是放在硬盘上面的。但是性能呢,非常低。OK,那也导致那我的MYSQL数据库可能会被高并发给冲垮。然后也会使我的系统的吞吐量啊下降。那么怎么办呢?咱可以加一层,在MYQ的上方,咱可以加一层缓存。
04:05
那么加入缓存之后,那么缓存我们知道,比如说像这种缓存啊,那通常呢,使用的可能比较多一点。那么它是一种内存型的数据库,那么内存型的数据库,那么它的特征是什么呢?首先是性能会比较高。但是它能够支撑的数据量可能会比较少啊,它可以支撑很高的吞吐量。性能非常好,但是呢,支撑的数据量会比较小。那么咱们这套呢,缓存加入之后呀,那咱就可以支撑更高的这种并发量以及吞吐量了。那比如说咱随便一个单节点,它可以支撑10万级别的这种并发量,但MYSQ呢,肯定受不了。如果我们没有这个ready缓的话,那么这10万个请求直达MY,那MYS呢,可能就会被咱的请求呢给冲垮了。
05:03
那么red的话,它就起到了很好的保护作用,那么以及带来的那么性能提升啊,性能提升啊。好,那么来看一下,那换成极端怎么回事呢?那换成极穿呢,是一个热点K过期。热点的key过期。那么导致。啊,导致我们的MYSQL服务器等级啊。哎,这怎么回事呢?一个热点的可过期。OK,那么刚才我们说过啊,那么RA呢,它是一个内存型的数据库,它能够支撑的数据量,那么是有限的啊,是有限的。那所以呢,通常啊,我们会给缓存呢,添加过期时间。过去十年。如果我不给缓存添加关系时间的话,那随着我们服务的运营时间的啊增长啊,那咱的缓存数据会越来越多。
06:02
那么我硬盘的数据量可以支撑很大呀,但内存它数据量是有限的。那如果我的缓存没有过期时间。就会导致我的内存呢,早晚有一天会被占满。那最终导致我的服务器内存资源耗尽而宕机。所以呢,为了避免这种问题出现,那我们要怎么样呢?要给缓存设置过期时间。那么既然设置到过期时间,那么任何数据都有可能会过期。那比如说呢,哎,某一天一个热烈的K过期了。既然是一个热量的K过期。那么大量请求呢?肯定会访问这条数据。那么一访问这条数据,诶发现呢,面没有这条数据,那比如说呢,有一个啊U的ID等于一的啊一个用户,它也是一个热点数据。啊,那么啊,它过期过之后呢,大量请求都来访问这条数据。那么这条数据呢,由于过期了,那就没有了,那没有了就会直达咱们的MYSQL数据库,导致MYSQL服务器那么承受不了,那承受不了怎么办呢?他就只能躺下了呀。
07:11
那导致MYSQ服务器宕机。那怎么办呢?哎,那么其实咱可以这样子。那么既然你所请求到达MYSQL服务器,可能会导下宕机,那你可以加一层加一层锁机制啊,加一层锁机制。那么你们呢,可以先来去抢这把锁,抢这把锁,那么谁抢到锁了,那么谁才能。访问我们的MYSQL数据库。好,咱可以呢,重新画这张图哈。那么缓存击穿呢,是一个热点的T过期啊,注意一个热点的。热恋的T。那么过期导致的。那么怎么回事呢?就是我缓存里面,比如说有一个user ID啊,等于一这条数据,哎,刚刚刚刚过期,那么此时大量请求来去访问这条数据,比如说有10万个请求啊来以访问这条数据。
08:07
那么这10万种图,诶发现呢,缓存里也没有,那没有呢,就会直达我的MYSQ数据库,那思数据库肯定支撑不了啊,那怎么办?我们就可以加一层锁基制啊,加一个锁基制。那么这样的话呢,哎,这10万个请求不会直达我们ma思Q数据库,他就要先去干嘛呢,先去抢锁。那么抢到锁的这个请求,那么才可以访问我的MYSQ数据库。那么访问了这个数据库之后呀,它可以呢,把这个数据重新放入缓存,那么你下一次来访问的时候,那缓存中呢,后一请求类一访问的时候,那缓存中呢,就已经有这条数据了。那么进而呢,就可以防止咱的MYSQ呢被冲垮啊。被重罚。好,这是它,但有同学说了,那老师那我这里还加锁,我加gbm锁可不可以呢?哎,好像也可以嘛,又加个本地锁。
09:06
亚培利索。还行不行呢?啊,不可以啊。啊,为什么不可以呢?啊,那么你想热点数据只有一个吗?可能不止一个,那么除了UID之外,UID等于一的这条数据之外,可能还有什么等于二的,等于三的,等于四的,等于五的,那么几十条啊,热点数据。那我这个服务是单机部署的吗?也可能不是。现在高并发情况下,我们一个服务呢,可能部署上百台服务器啊,上百台服务器。那么如果你使用接用本地索的话,那我每个服务器都会放一个请求过来的呀,到达我这个货去啊,都去到达我的maq数据库。然后呢,我有几十个热点数据,那么你锁你肯定只能锁当前这里这一条数据啊,那么这一条数据我放一个请求过去,那我几十个热点数据来弄。
10:00
几十个人数据。那么假设呢?我有几百台服务器。那可能就会有。几千个甚至上万个请求,那么直接得到我的MYSQ数据库了。那我的MY数据还有还有没有其他请求呢。依然可能会有其他请求。所以导致咱们MYSQ呢,这种请求啊,这种连接啊,就会导致他不可控,对吧,不可控。所以呢,一般呢,我们会使用它的使用啊,分布式锁,我只放一个请求过去就可以了,那么这一个请求呢,查询完思库之后呀,就可以把MY思库里面的数据要给我们放入。那么后续所有请求就可以从release环境中来,就给我命中了啊。就给命中了。那如果使用本地素。那么还是有不可控性。所以呢,分布式锁才是最佳选择啊。
我来说两句