00:00
好,前面呢,我们使用red完成了一个分布式锁,但是在我们后来的系统开发中,我们分布式系统中将会用到各种各样的锁,但是呢,一句话,我们说之前我们学过的各种本地锁,Synchronized的也好,包括大家知道的goc里边的这look,我们来看一下,那么goc里边的各种锁,我们的读写锁也好,我们下边呢,这有一个读写锁,可重入锁,包括我们一些高级特性,比如countdown launch b锁,还有我们的信号量simpleer,这些锁呢,我们都称为这些本地锁,在我们分布式系统下呢,都没得用,因为它只能锁住我们当前的这个进程,然我们当前服务,它不能锁住我们所有的服务,而未来我们分布式系统中如果还想要用这些高级的锁,要锁住所有服务的,那相当于我们guc包下的这些默认东西我们就没法用了,而且我们还得自己再来实现这些高级。
01:00
左特性,那么现在只实现了一个简单的分布式锁,类似于我们guc下边的我们这个re return lock,我们可重入锁一样,好,我们来点进来可以看一下CH,我们相当于只实现了这么一个功能,我们以前又接UC,它我们可以来进行加锁和解锁,但是那后来的这些高级的摘锁功能怎么办呢?我们就有一个专业的框架,包括我们来参照red官方文档,我们在之前分布式锁我们是使用这个东西的,Red官方文档呢,下边有说说我们这种设计模式啊,并不来推荐来实现我们rabbit的分布式锁,虽然我们下边可以做一些优化,他说我们应该来参照我们有一个叫read look算法的这个实现,好我们来点进来看一下。这个呢,只是复杂了一点,那么这个read lock的全称就叫red分布式锁,取它的前两个red re分布式D加上lock,这我们称的red lock,那如何实现我们red的各种分布式锁,因为分布式锁不只是我们简单的这一个锁的称呼,他是在我们分布式系统下各种锁的集合,比如我在分布式系统下,我也想要用读写锁,想要用闭锁,想要用信号量等等一堆东西,那这怎么实现呢?我们可以来参照我们re文档呢,说它呢有这么多的实现。
02:26
如果我们用pant,我们就可以使用它,如果用PHP的可以使用它,但我们是Java语言,我们就可以使用一个东西叫reddison,这个翻译看起来就像red的儿子,所以他是来完整实现我们red分布式所的,好来点进来看一下,那我们后来的系统里边,我们就使用red完成我们所有的分布式锁功能,而且这一块呢,是我们red的官方网页地址,大家可以来看一下,那文档呢,在下边也有,来点开这个文档,所有的使用全部参照文档就行了,而且这一块文档也都有做中文文档,我们每一次点链接,我们都点这个中文链接,就能看到它的中文档,还是非常友好的。比如我们来看一下这个概述,那reddi呢,其实就是在基于red的基础上实现的一个,它叫Java助内存数据网格,也就是reddi操作的所有东西,其实也是在reddi里边的,但是呢,它给我们提供了非常多的特性功能,比如一些分布式对象,慢。
03:26
List set等等,我们以前呢,整的这些map list set,我们都是new,在我们当前这个服务里边,如果我们在这1NEW,我们都是在当前服务里边,也只是在当前进程里边,如果我们使用reddi这些我们称为分布式对象,那么整的这些集合list,它默认呢,都会给我们放在red里边,大家都能公共操作,所以呢,他给我们封装了很多东西,比如分布式的对象,还有一些分布式服务,包括我们后来用的分布式的各种锁,比如我们的分布式信号量,分布式闭锁,以及我们分布式锁,这些特性呢,我们都在reddi里边有所封装,而它呢,有非常多好的特性在这一块呢,都有介绍,大家看一下就行,所以呢,我们就来使用red来完成我们以后所有的分布式锁功能,那怎么完成我们先要做的第一件事,肯定就是导入依赖,我们在me仓库里边来找一下我们这个reddison的依赖。
04:22
好,我们来输入一个,我们是。这一块呢,查出我们这个reddi的依赖,那么除了reddi的本身的核心包,Reddi官方还为我们reddi抽取了一个spring boot starter,相当于我们场景启动器,这个好处呢,就是相当于reddi什么东西都是自动配好了,我们只写两三个配置就行了,但是呢,我们第一次来使用reddi,我们还是从头到尾手动的写一遍,大家对里边的原理还能掌握的比较清楚一点。好,我呢就引入我们这个reddi的原生核心依赖,把这一块也介绍我们这个red,它就是一个red的Java客户端,其实跟我们以前用的简A或者LIS一样,他们都是来操作red的一个客户端,只不过reddi它能提供更强大更深入的一些功能特性,所以我们就来引入他来点312。
05:15
来就来复制这个,那先来到我们商品服务,我们这个po文件里边,来先来引入我们的red,好这引入过来呢,我主要是以后使用它,以后我们这个使用咱们这个reddi作为所有咱们这个分布式所,包括我们这个分布式对象的功能的这个框架。那以后呢,就来用它,所以我们整合reddison第一步我们先来导入依赖我们来记录一下,来到我们这个商品服务里边,把我们所有的操作呢,都来记录一下,下来是第一个整合咱们这个。作为咱们这个分布式所等功能的这个框架,好,我们先第一步,我们先引入依赖,引入依赖这依赖呢,就是这个,接下来我们来第二步,那我们依赖引入以后呢,我们接下来就要配置咱们这个red。
06:18
我这red如何配置,我们全部都要参照官方文档来看一下,那red呢,官方文档在这一块呢,有一个叫配置方法啊。配置方法里边呢,有非常多目录,我们可以使用配置文件的方式,也可以自己来写程序化的配置,比如我们就来看程序化的配置,他说我们这个reddi是通过构建我们conve对象的实例来最终配置的,而且对reddison的所有使用,我们都必须通过一个叫reddi client,就是reddison的客户端。这个客户端他去来操作red,比如要操作哪个red,我们在这儿可以配上red的主机地址,而且这个配置呢,我们可以自己程序化配置,我们也可以用配置文件的方式,比如我们可以con对象加载一个jas配置,或者压麦尔配置都行行,我们现在呢就来使用程序化配置,好,我们来要使用red,我们给config里边,比如我们来写一个就叫MY。
07:18
Reddiant con,好们来看一下我们如何把reddi配置并使用出来。我们先来写一个configuration,我们先来写一个public,我们需要使用reddi,必须容器中有一个叫reddi client,就是我们reddison的客户端,包括这一块的所有我们都可以来参照,这有个第三方框架整合。我们可以跟spring整合,用插面配置的方式,或者呢用我们代码的方式,我们下边呢,也都有来看一下,比如这一块,这一块呢,虽说是跟spring catch整合,我们先不关心,我们就来把这一块来复制过来,好,我们把它的这一块代码我们拿过来,来看这一块代码的作用来。
08:02
导入这些依赖,我们叫red client,包括他要抛一些异常,我们都来导入过来,导入过来。好,我们现在呢来看ant b,就是给我们容器中放一个组件,组件的类型就是red client,好,这就是我们使用reddi要做的第一件事,所有对reddi的操作都要通过这个reddi client,所有对咱们这个Di的使用的使用都是通过咱们这个reddi client对象,所以呢,我们给容器中放一个这个对象,而且这个对象呢也指定了destroy method,就是呢我们的销毁方法,如果我们服务停止以后,它会调用这个东西来进行销毁,而且这个对象的创建呢,我们是复制了一段代码,这个代码呢,我们能看到这是一个reddi,这是一个使用reddi集群模式,我们相当于装了多个red,但是我们现在是单个red模式,所以我们还是参照官方文档control home来这儿,还是来到配置方法。
09:06
那么程序化配置里边,我们来看有没有我们这个单节点模式的,我一直往下翻,包括每一个配置都是什么意思,这都有解释,那么这是集群模式,我们来一直往下。来找一找,下边呢,我们有一个叫这是云托管,还不是,我们来再来看一下,我们一直找下边来看有没有我们这个,诶这有个单节点reddi的模式,所以我们要连单个reddi,创建出我们这个reddi客户端,我们就是使用下边这个配置,那最简单就是上面一句话,使用reddi create,就像我们编写的这一块reddi create,但是呢,它默认这个create,什么配置都不指定,它默认连接的是本机的reddi,但是我们应该用这种,我们先创建一个配置类叫config,然后呢,Config指定使用single server们单节电模式,再来设置上我们red的主机地址,来看这块呢,Config就已经用好了,我把这一块呢全部删掉,我来写一个叫config,点一个use single server啊,我们使用单节点模式,还有一个叫set address,设置一个地址,那这个地址是什么,我们就可以来指定我们虚拟机,比如我们是幺九。
10:19
2.168.56.10,然后呢,我们red的端口号,我们是6379,这相当于指定我们这个red,连接这个red,所以说我们第一步来创建我们这个配置,创建配置。这个配置创建完以后呢,接下来第二步使用我们这个reddi,直接根据咱们这个conf对象创建出我们这个实例创建出。我们叫red client这个实例,比如我们把这一段代码我来复制过来。我们把它放在这儿,好,它创建出这个实例,我们最终呢就是返回这个实例,这就是我们自个儿来配了一个red,那么来测试一下容器中的这个red能不能用来写好以后我们都来做一个单元测试,好,我们自己来写一个测试方法。
11:09
Public VO,我们把这个测试方法拿过来,我们这个测试呢,就叫reddi,我们就来测试,我们给容器中我们自己放了一个叫reddi client,我们自动注入过来,来看容器中只要有那就能用了,好,Reddi client,我们就叫red client o。然后我们在这来打印一下C4OUT,那么这个client对象只要能创建出来,那么就能用,只要有这个对象,我们以后所有的高级操作全部都在这里边儿有各种东西,那这些东西都是什么,我们后来再说啊。把这个呢,来删掉,来测试一下走,我们来看一下我们这个能不能创建成功。好,我发现呢,这有一个错误,这个错误的原因。说我们这个LC容器启动出现问题了,我们来看下边的问题,它不能创建我们这个reddi实例,原因是在这,我们来看下面报错,说我们这个red的URL地址必须以我们这个red冒号双斜杠,或者RED2个S双斜杠,所以我们来看啊,这有这么一个错误,我们来到我们的配置里边,他说我们这个red的这个地址有问题,他报了一个这个错。
12:28
这个错是什么呢?其实我们参照官方文档我们就能看出来,Control home我们来到这儿,在程序化配置里边,如果我们来仔细阅读,我们看到在这一块呢,他写red地址的时候,必须来加一个red冒号双斜杠,而且如果我们red启用了安全连接,那就是写上两个S代表用安全连接,所以我们相当于没写我这个连接写一名,我们就把这个来加上CTRLC好。然后我们来重新进行单元测试,我们看现在能不能获取到我们这个red实力。
13:03
我们都来使用reddi来做就行了,包括我们业务里边,比如我们业务里边,我们以前用的这个分布式锁,想要使用我们就直接用red client来操作好,我们下一节课来看一下reddi如何使用它的这些分布式锁等各种功能。
我来说两句