00:00
好,接下来呢,我们就给我们每一个需要缓存的业务中来正确加上我们缓存的使用逻辑,首先我们要正确加上缓存的使用,那就得考虑缓存的两种用法模式,第一种呢是读模式,第二种式写模式。读模式就是我们说的如何读取一个数据,我们应该遵循先从缓存中读取,缓存中没有呢,再来读取数据库,如果查到数据,我们放入缓存中,然后给他返回,方便我们下一次查询。还有我们这个写模式,如何保证我们缓存里边的数据跟数据库的数据是一样的。我们可以使用双写模式,或者呢失效模式,双写模式呢指的就是我们如果修改了一个数据,比如我修改了一号数据。如果一号数据同时要在缓存中有,那么可以来改完数据库以后,再把一号的这个数据,最新的数据我们再给缓存中改一份,相当于再放一份把以前的覆盖掉,这是我们说的双写模式,我们还可以使用失效模式,我们改完一个数据以后,比如改了一号菜单,我们可以把缓存直接清掉,比如缓存了一号菜单的这一块内容,还有我们整个所有菜单,我们都可以来清掉,我们最终呢,让它保持下一次请求去来查缓存中没有去数据库呢,查一份新的。当然如果出现数据不一致,我们可以通过加锁来保证它的顺序一致性问题,达到我们缓存与数据库的最终一致。
01:30
但是我们会发现,我们后来每一个业务代码,我们都要用缓存,我们都是这种编码模式,我们这一块是这样子的,比如我们想要给他加缓存,缓存我们这个一级的所有菜单,我们也得写那一套代码,先读缓存,缓存没有再来查数据库,然后封装返回等等一大串,每次都这样写呢,太麻烦了。所以我们希望能有一个非常简单的方式来最终整合和使用缓存。那我们spring呢,就基于这种,它专门抽取了一个叫spring catch spring catch呢是专门对缓存的一个抽象层,Spring从三点一开始,它定义呢,两个接口,一个叫catch,一个叫catch manager,它希望通过这两个来统一我们不同的缓存技术,而且呢,它还提供了非常多的注解,如果我们使用了spring catch,那就可以通过简单的几个注解,直接将我们所有的缓存功能跑起来,我们就不用编写那么一大堆的模式代码了。spring catch相关的文档我们来也可以给大家看一下,大家可以来搜索我们这个spring,我们来到spring的官方网站spring IO,然后呢,Spring的这个catch,它属于spring框架的部分。
02:41
不属于spring boot spring boot相当于一个再整合,所以我们来到spring framework啊,在spring framework里边我们来选一个,选一个512版本,随便选一个我们这个发布版的。然后呢,我们来看它这一块的整个划分。这是spring的一些LC容器核心,这是单元测试,这是数据访问,还有spring mvc,还有响应式编程的,哎,我们这一块是integration,这是我们整合,整合里边呢,专门有一个叫catch,就是我们缓存操作的好,我们来点进来,所有的spring的所有使用办法,我们完全可以参照它的官方文档来一直往下翻,在下边呢,有它的这个缓存使用。
03:24
在上边,好,它这缩了一下,好,那我们在上面在第八章这有一个catchnch amstra,这就是我们的缓存抽象,就是呢,从我们3.1以后的spring,它都为我们提供了缓存抽象层,那有了它,我们使用缓存呢就简单多了,那么要使用咱们这个spring的缓存抽象,其实在后来我们就用这么几个简单的注解就能完成所有功能,但是在用这些注解之前,我们先来说一下它里边的一些核心概念。首先spring呢,为了统一缓存,它抽取了这么两个接口,一个叫catch catch呢顾名思义就是缓存,它就是来操作缓存里边增删改、查数据的,还有一个叫看manager,我们称为缓存管理器,缓存管理器顾名思义就是来管理各种各样缓存的,那他们的关系呢?比如我们这张图,我们一个应用里边,我们要使用缓存,我们首先给当前应用里边得配一个或者多个我们缓存管理器,这个我们称为catch manager,这是一个接口,我们来看一下control n来找一个catch manager。
04:32
选中我们是spring framework框架的来点进来,这叫缓存管理器,缓存管理器呢,发现这只有两个接口,相当于两个功能,第一个功能就是呢,按照名字得到一个缓存,第二个功能是获取我们相当于这个缓存管理器里边管的所有缓存他们的名字,所以呢,Catch manager那就非常简单了,那就如下图,那么这呢有一个catch manager catch manager呢可以管理非常多种不同名字的缓存,我们叫catch,叫catch,一个catch manage能管理各种缓存。
05:08
而缓存又是什么?我们点过来看一下,那这呢有一个catch接口,但这个接口呢,定义了一些功能,比如我们这个缓存的名字,那就是当前缓存的名字,还有我们这个缓存如何从缓存里边查询一个数据,还有我们这个如何从缓存里边,诶我们这个是如何给缓存里边按照KV保存一个数据,还有我们这个如何有一个evict,我们相当于从缓存里边按照K清除一个数据,移除一个数据remove,还有一个我们叫可丽尔,相当于清空我们整个缓存,相当于我们这个缓存接口,相当于就是对缓存的增删改查,所以呢,最终的关系是这样子的,每一个缓存管理器管理了非常多种名字不同的缓存,而他们真正要对缓存进行增删改查,是来用缓存组件操作的,我们也可以来看一下缓存门者有多少的实现CTRLH。
06:06
那么这里边呢?目前看到这么多,Spring其实支持非常多种不同形式的缓存,比如可以用conka map catch manager,顾名思义我们这个缓存管理器。我们来看这张图,这个缓存管理器产生的所有缓存都是利用coner map来做的,我们可以点进来看一下它的源码,大概呢,大家了解一下就行了,来看这个concu map catch manager,它肯定呢会获取缓存之类的方法,好我们别的不看,这来看这个conka map catch manager,它的这个构造器,构造器里边呢传入非常多缓存的名字,好多同学现在对这个缓存的名字感觉理解起来有点费劲,缓存的名字呢,大家这么来考虑,就是我们缓存管理器里边,它管理缓存组件,为了方便呢,给每一个组件起了一个名字,这个就类似于我们数据的给他们画了一个区一样。
07:02
比如缓存管理器就是我们北京市政府,那将来还有北京市的其他各个大区,无论是哪一个大区,都应该跟市政府的所有管理制度,所有东西都是同步的,唯一不同的就是区域里边的数据不一样,这样做的好处就是如果我们后来想要清除缓存,我就想清除跟员工有关的所有数据,那我们就直接说我清除员工区域的,那相当于咔咔咔这些缓存就清了,我们不去划分这些区域也没有任何问题,这些相当于只是一个业务逻辑上的一些标识,那么后来再来使用注解的时候,我们慢慢来深入理解就行了。我们继续来看这个缓存管理器呢,在构造器的时候,能传入他能管理的所有缓存的名字。然后呢,在构造机会调用set catch names方法来点进来set catch names就是这,诶我们发现呢,有好多缓存的名字,如果缓存的名字不会空,然后呢,然后呢,它就会便利便利每一个缓存的名字,按照这个缓存的名字给这个东西里边放一个东西,这个东西是什么?我们来点过来看一下,诶这是一个catch map,它最大的特点呢,它其实是一个map。
08:14
Map呢是一个KV的形式,K呢是指一个string,相当于我们缓存的名字,而V的值是我们指这个catch接口,相当于我们缓存组件,那这就解释了我们缓存管理器里边管理了我们很多的缓存组件,而且一开始它在这构造的时候,如果这个缓存组件默认没有我们说有这么多缓存,那接下来呢,它就会初始化创建,我们来看put的时候,它会调用create方法,按照这个名字创建一个缓存,而这个缓存真正是啥玩意儿,其实就是一个conar map catch就是这个类型的缓存组件,这个类型缓存组件呢,它肯定要定义我们对缓存的增删改查操作。但无论怎样增删改查操作,我们会发现这里边呢,有一个变量叫store,相当于我们存储数据的地方,那么就考虑这种类型的缓存,所有的数据都是存到这些map里边的,按照KVKV,比如我们来找它的这些方法,比如这有lookup,这相当于从缓存中获取数据,那们这个get方法获取数据,他们对所有数据的获取呢,都是从这个store里边获取的,包括我们来保存也都是从store里边保存的,所以就是一句话,我们concuent map catch manager造的这些含缓存,它里边都是用concuent map来保存数据的。那同样的,如果我们用了red,就应该有red的catch manager,那red的catch manager缓存管理器,它造的这些缓存相当于数据都是保存到red中的,那以此类推,Spring可以兼容无限种缓存。
09:49
只要有对应的缓存管理器,它能造出这种这样的缓存,只要缓存呢,自己来操作对应的东西,哪怕是操作我们这个芒果DP拉马Soo都行,只要你认为这是缓存,它呢就会定义给这里边如何保存数据,如何删除数据,好了说这么一堆呢,可能大家非常的懵,没关系,我们把注解一用起来,这一块的整个逻辑就清晰了很多,主要就是一件事,我们缓存管理器大家就认为这是一个市政府,它只是定义规则的,比如我们存数据的时候,过期时间,有多少数据,怎样转换过来转换过去等等,它是定义规则的,就是利用这个catch manager定义的这些规则,最终造出这些缓存组件,这缓存组件才真正给我帮我们给缓存里边c rud数据的。
10:40
我们这些组件呢,大家也可以从业务逻辑上划分成很多种不同的区,这只是我们从业务逻辑上我们划分出来的,实际上他们如果我们只有单台red,我们这个red缓存管理器造的这些缓存组件,它都是存到了我们这一台red上了,所以其实他们的这些东西本来是没有任何区别的,只不过我们认为一号二号就在这个里边,三号、四号数据在这个逻辑里边,那以后我们想删所有的,比如商品啦,员工了,我们只需要说我要删除员工区域的缓存,那相当于原来的一号二号数据就只删了,不影响其他东西了。
11:20
我们做了一个逻辑的划分而已,这是我们对spring的简单介绍,那么下一刻就来整合spring。
我来说两句