00:00
最后要给大家介绍的呢,就是我们MYT当中的缓存,首先我们先来说一下缓存的作用哈,缓存呢,是一般的orm这个框架都会去提供的功能,那哈的这个框架当中其实也是有的,目的呢,就是为了去提升查询的效率,还有减少我们数据库的压力,那么一般就是咱们把经常查询的这种数据呢,存放在缓存,其实就是内存当中了,这个时候如果有很多的用户再去查询这个数据的时候,就不是去从我们的数据库当中去查询了,而是直接从缓存当中查询,那你想想啊,你减少了在数据库当中的查找,那是不是就相当于提升了效率,能懂这个意思吧,那其实这个就有点像人,对不对?比如说这个知识点你是记在脑子里的,那你用的时候是不是直接从脑子里拿出来就行了,可如果你不知道,你还先去翻对不对?比如说一个字怎么写,你还先去翻字典,这样是不是就会很麻烦,所以相当于那字典就是你的数据库,如果你知道怎么写,就从记忆当中去获取,对不对?诶如果你要是不知道,只能。
01:00
去查询字典,那你想想哪个快对吧,所以呢,在这个当中呢,这就是我们缓存的这样子的一个作用哈,啊还有呢,就是。嗯,它的一些用处,MY呢,有一级缓存和二级缓存,它也是都有的哈,而且呢,预留了集成第三方缓存的接口,呃,当然未来呢,我们用很多时候的缓存呢,都是提呃使用第三方的插件哈,那么当然呢,我们还是要先了解一下什么是一级缓存二级缓存my piece的这个缓存结构,大家可以看一下哈,就在MYBY的这个org,阿帕奇的这个K看到了吗?K就是缓存在这个里边的这个内容当中哈,大家了解一下,到时候知道从哪去找,那接下来呢,我们就来说一下MY一级缓存,一级缓存先记住一个重点,它是circle session级别的缓存,是自动开启的,那么我们在操作数据库的时候呢,是需要构造circle session对象的,这个大家都知道,它其实就是连接对象对吧,那么在我们的这个对象当中呢,有一个内存区域,就是一个数据结构,那么它其实是用的是哈西map这种结构,用于去存储缓存的数据,那不同的这个circle session之间的缓存数据区。
02:09
域就是。不同的circle session之间的这个缓存就是这个哈,Map是互相不影响的一级缓存的作用域呢,是同一个circle session,在同一个circle session当中呢,两次去执行相同的circle语句,第一次执行完毕会将数据库当中的查询数据写入到缓存,第二次再从去查询的时候呢,就不用从数据库当中查询了,那么直接从内存当中去查询。那大家就看出来了,一级缓存呢,其实也是能够在一定程度上去提高我们的查询效率的,对吧。那么当一个circle session结束后呢?Circle session当中的这个一级缓存不存在,不存在之后你就不能用了,对吧?嗯,My circle呢,默认开启一级缓存,存在本啊,存在内存当中,就是本地缓存是不能被关闭的,那么将来呢,我们可以去调用clear k来清空本地缓存,或者改变缓存的作用域,我在这儿呢给大家画了一个简单的一级缓存的分析图,那么比如说我们要去查询我们的这个。
03:13
查询我们的这个数据就是呃,球队的这个数据哈,那么我们是根据ID来进行查询的,如果我们第一次来进行查询的是team ID等于1001的球队,他其实也会先去找缓存,但是因为你是第一次查,缓存当中是没有的,所以他就去查询数据库,先从DB当中去查,查询到这个数据之后呢,他就把这个写入到缓存了,注意啊,它相当于就是在一个circle库当中有这样子的一个一级缓存的区域,它就把这个缓存存进去了,好,存进去之后,当我们第二次再有人去查询team等于1001的时候,那么这个时候呢,它其实就是先去从缓存当中读取数据,那他就不需要去走数据库了,对吧?诶,但是有一个特点呢,那么接下来第三个人去对我们的这个team表进行了增加也好,修改也好,删除也好,不管怎么样,就是他做了增删改,并且提交成功。
04:10
并且提交成功之后,这个时候你的这个缓存就不存在了,因为他的这个增删改并提交之后有清空缓存的作用,那这个时候如果第四个人再去查team ID等于110011,那就要去重复了,先找缓存,没有没有这个时候就去找DB,然后他就把这个数据再去存入这个缓存,啊注意这个时候他就再去存入我们这个缓存,那么再次存入缓存之后,下次有人查就可以直接去获取了,听明白这个意思了吧,所以其实这个就有点儿像什么呢?我们的缓存其实就相当于是你看一个人查完了之后,他第一次肯定会有一点慢,对不对,一个人查完之后呢,他写入到缓存里边,就相当于一个人把这棵大树种下来了,但是以后的人再去查询的时候,就不用走数据库,直接走缓存,那后人都可以直接来乘量了。听清楚这个意思了吧,但是因为你是对于T表的查询,但是只要有人对T表进行了增删改,因为我们说增删改都会把表当中的数据进行修改,对不对。
05:11
而且提交之后,你的这个team里边的这个缓存啊,你这个so session当中的这个一级缓存就已经不存在了,它就会被清空了,听清楚这个意思了吗?啊,所以底下呢,我们也用文字给大家去啊做了说明,但是你这个缓存的前提不就是说第二个人能用缓存的前提是你的circle session是没有关闭的,好吧,我们在这儿呢,给大家来验证一下这个一级的这个缓存,看看说是不是跟老师说的这个一样,因为我们的一级缓存是自动开启的哈,所以呢,我在这儿你来看哈,哦,我在这个当中来创建一个吧,比如说TEST06。然后呢,我们把它叫做test。好,那么这些呢,我们都不动,把这些先全部都删掉哈,测试缓存了。那么首先我在这个里边去创建查询一个我们的对象,比如说查询一个team哈,第一,那么我们在这个当中呢,得拿到我们的circle session啊,没有circle session对吧?嗯,那我们就直接在这个里边通过我们的题目map嘛,对不对,然后呢,在这个里边直接,嗯这样吧。
06:18
我们就直接去拿着circle session去干活可以吧,不用map了哈,好,我直接去操作就行了哈,嗯,Circle session好了,我们就直接用原生的就行了哈,好了,让大家能够明确的看到你说,诶这个就是你的这个circle session对吧?那么我们在这个当中呢,咱们不是原来学过select one,就是原始的核心的这个查询方法对不对,MY关系的核心的这个接口,好,我在这个当中呢,查询。com点咱们之前里边是不是有个Lina点我们的mapma。PPR在这个里边咱们是不是有一个叫做team mappr里边是不是有一个叫做query by ID来着,对吧?后边我们查询一个指1001,这是不是就是我第一次去查询的,第一次查询他也先走缓存,但是呢,你会发现缓存没有嘛,没有是不是就只只能走数据库对不对?好了,那么这个里边呢,我们就在这个当中去查询,注意哦,那么这个时候它就是怎么样,那么他肯定是第一次查询,那就是查询什么数据库对不对,查询DB,然后查询出来之后怎么样存入我们的一级缓存,好了,那现在我们存入一级缓存了,接下来连接没有关闭哦,连接没有关闭,我们在这个当中就直接用我们的T2再来继续circle session.select one好了,同样的就是我再来查询一次。
07:44
好,查询完毕之后呢,我们在这个里边再来去输出一下我们的T2,那么这个它就应该怎么样了,这个是不是就是我们说的,他应该是先去怎么样查询缓存吧,对不对,先查询我们的缓存对不对,然后直接。
08:05
那么不需要怎么样发送我们的啊,不需要发送语句到数据库查询,因为你这个里边有吗?那有同学说到底对不对呢?我们可以在这来看一下啊,最后把这个circlerc session来关闭一下就可以了,C哈,好,我们来测试一下,有同学说这个怎么看看日志大家就能够看出来哦,好,那么我们在这个当中呢,来看这个test的零一,咱们第一次的时候,你看是不是发送circlel语句过去了,发送完了之后,这个是参数得到的结果,然后输出。但是你看第二次有查询吗?是不是你通篇从头到尾只有一条circlel语句,那就意味着第二次没有走circle语句有。听清楚这个意思了吧,但是注意哦,但是我们在这个里边来说,如果你在这个中间把我们的这个circle给它进行了关闭。
09:01
好,我们再来执行一下。应该这样子啊,应该在这我们的my back的YouTube点我们的什么呀,Close我们的circle session,这个是不是就相当于是在关闭连接,关闭连接是不是就是一级缓存就怎么样,是不是一级缓存就没有了,对吧?所以一级缓存被清空呀,好,那么在这个当中呢,如果你要是被清空之后,你这个circle session是不是就不能用了呀?所以注意哦,Circle session我们就得再重新来获取MYBA在这个里边打点get我们的circle session。好,重新获取一下啊,好了再来执行。好,这次我们来看SQL语句是不是发送了一次,底下这个是不是又发送了一次,看清楚这个意思了吗?所以就是说如果你要是没有去关闭连接的时候,它可以就直接去操作啊,然后呢,我们在这个里边已经能够明确看出两个区别来了吧,我们把这个注掉再来观察一下没有关闭连接,它看缓存的这个情况,好,因为你看这个里边是不是就直接是怎么样,这个当中是不是就是直接一条搜索L语句,是不是我们通过这个日志当中已经明确能够让大家来看出来这两个的区别了。
10:19
听清楚这个意思了吗?好了,那么这个时候呢,我们查询完之后,这个这个这个这个是如果我要是关闭之后再次去查询,是不是它就又查完了,再次去发送到我们的,呃,再次去存入我们的缓存,好,然后呢,我们在这个里边写了个T3,然后在这来输出T3,看清楚了吗?好看做完了之后呢,我们在这个里边没有做关闭连接,可是我在这个里边去用我们的circle session在这个里边去执行了一个delete,那么我们在这个当中删除的时候,咱们是不是在team map当中曾经有过我们的de,对吧?所以呢,我们就在这个当中直接打点去写上我们的de,比如说我们在这个里边删除的,即使是没有这个条数据,听清楚这个意思了啊,我们在这个当中,即使是没有这条数据,我们在这来输出一下我们的删除,嗯,这样我们用circle session。
11:19
点commit一下可以吧,然后呢,我们在这个里边来删除一下,提交删除结果,好删除结果,然后呢,在这个里边呢,我们得到的这个结果就应该是我们的de对吧?好了,得到之后呢,我再来去查询。把这个改成T4,大家能够从这个里边看出我的意图来吗?所以就是说我们在这个当中哈,我们把这个连接来关闭一下,close.close好了,那么你看啊,我们在这个里边,我们通过断点来观察,大家自己去猜测哈。前面咱们已经比较熟了,哎呀,这个断点我们先把它去掉啊。
12:04
那么在这个里边呢,我们应该是已经比较熟了哈,把这个断点直接到断点了。没有设好吗?这个里边把这端点设在这啊,从来执行。我把这个断点都取消了,还不行,我把其他的断点都取消好吧,嗯,然后呢,这些内容就是除了这个之外,我们就全部都给它删掉。好了,我们把这些该删的就都删掉了,现在没有断点,是不是重新点一下哈,好了,我们在这个里边来测试,我们一边执行,然后呢,大家一边来猜测哈,第一次查询必然是要去走数据库的,所以这个是没什么好说的,对不对,所以呢,在这个里边我们就要能够看到在控制台上它必然发送搜后已到数据库了,好,第二条直接输出,然后呢,在这个里边关闭连接,注意哦,你输出在这个里边查询完毕之后,其实它就存入到了我们的一级缓存了,对不对,存入到了我们的一级缓存了哈,那么现在呢,连接关闭,缓存就被清空了,好连接,然后重新获取连接再查,那么再走数据库,这现在是不是也走数据库哈,走完数据库它就存到我们的缓存,当中了,然后来输出第三步注意了,这个时候是不是存了缓存了,这一步是不是就不需要走了,然后你看我们来执行控制台上是不是没有任何东西,但是你直接输出是不是这条就是我们的这个内容直接输出出来,然后现在我们删除两。
13:33
两签这个数据其实没有,那么在这个里边,但是即使是没有,是不是你也再去执行delete,只是受影响的行数是零,提交之后我们删除的结果在这个里边得到的是零,请问这个用不用走数据库?用不用?在这个里边大家要考虑,当然要用,为什么第一连接没有关闭,所以缓存依然存在对不对?那有同学说了,缓存依然存在,为什么还要到数据库,因为你删除导致了什么。
14:03
增删改提交之后,是不是都会把缓存清空,所以呢,在这个当中呢,那么我们在这个里边删除之后也是会清空缓存,所以你这个时候依然要走数据库。听明白我们一级缓存的这整个流程了吗?啊,那么这样子呢,就是我们在这个里边通过案例来给大家去说明了我们在这个里边一级缓存的这个内容,好,那么这个说完之后呢,我们这个案例已经给大家写好了,写在笔记上了,我之前讲课所有的内容都在笔记上,我只不过是不喜欢打开着笔记,然后给大家看哈。这个呢,清空缓存的方式,当然了,我们之前呢,也就是说你执行过增删改之后都可以,还有呢,就是关闭连接可以,其实还有就是sessionine的clear k也是可以的,还有呢,就是差毛当中有配置也可以,Roll back和提交也都会去进行,什么呀,缓存的清空以后呢,我们会见的越来越多,现在是不是见过两个了,见过三个,其实commit是这样的,Roll back也是这样子,好吧,Roll back也是这样子,好了,那么现在在这个当中呢,我们已经有了一个,两个,三个,四个,这四个是不是都知道了,这些和这些呢,我们稍后会给大家说好,那么刚才说的呢,就是我们的一级缓存了。
我来说两句