00:00
学习一下缓存系统。首先了解一下什么是缓存,缓存就是我们将一系列比较复杂的查询出来的一些结果,比如说比较耗时的查询出来一些结果,把这个结果给存储到一个文件或者内存中,这样当我们再次使用的时候,直接从文件或者内存中去读取出来这个数据,从而就。呃,避免了再次去进行一个比较长时间的一个查询啊,这样的一个操作,我们称为缓存。啊,而为我们的这个后端缓存提供了丰富而统一的API。那什么叫统一呢?就是说不管我们的驱动使用文件或者内存,或者其他的这个。甚至是数据库。都使用了统一的API,也就是说我们代码中在使用缓存的地方。就使用统一的API。当我们的这个驱动发生改变,比如说我们使用文件突然想改成了,而我们代码无需做相应的调整啊,这就是拉为我们提供的丰富而统一的API。
01:03
缓存的配置文件,在con开启这个文件来看一下。找到configa里面有一个。Catch启啊,这是缓存相关的一些配置,Default是他默认使用的一个驱动,当然我们我们默认使用的是一个文件的驱动,可以通过去改EV里面的这个。配置去来决定我们缓存使用哪个驱动啊,一般的话,其实在商业的项目中使用red驱动多一些,因为它可以把数据包我们缓存到内存中,在内存中的读写速度还是比较快的。好,接下来往下看,有这些驱动的一些配置。啊,包括这个数据库的驱动的配置,就是说本地文件的一些驱动的一些配置,比如我们使用文件,它文件缓存会写到哪个目录,对吧?啊还有就是。啊,慢慢看起来的一些配置,使用red的一些配置啊,当我们这里驱动如果是改成了其他的话,它就会使用相应的一些配置啊,当然还是建议如果EV里面我们有的这些配置的话,尽可能的去EV里面去修改,而不要直接去改这个配置文件,以防止因为你改了这个配置,最终这个配置进了版本库,对生产环境的项目造成了一些不好的一些影响。
02:21
这里是配置的缓存的一个前缀。手册这里为我们介绍了啊,配置各个驱动的一个啊,细节的一个情况啊,如果我们要使用数据库系统,还要去创建这个K表,并且使用迁移命令这个命令去生成。这个开启的一个表,当我们使用catch的话,你要装相应的一个扩展,如果使用嗯,Red的话,你要去装这个p red的一个扩展。我们这里做练习就默认使用这个文件的这个啊。驱动就可以了啊。如何获取这个缓存?缓存的一个使用,我们今天学这个主要练习的就是缓存的这个使用,就是缓存的设置和缓存的一个读取。
03:06
还是在。这里啊,我们的test控制器里面去进行代码的一个练习。首先啊。呃,Lover为我们提供了开启的一个门面来帮助我们去访问和设置缓存。同样的,它还提供了一个开启的。啊,辅助函数啊,这里我们先使用门面的方式去使用这个缓存。获取一个缓存使用开启门面提供的get方法,可以去获取一个缓存。如果你要访问其他存储的缓存,可以用套方法去选择钥匙有的一个驱动,就像我们之前在学文件存储的时候,我们使用这个storage的Dis这个方法可以选择对应的磁盘一样,缓存的话,我们可以使用太启门面提供的词的方法选择对应的驱动,如果你不写这个默认就会使用就是默认的你配置的这个驱动啊,比如我们的边默认的是这个。
04:03
啊,也就是我们这里使用的这个驱动。啊,当然我们还可以是去指定要使用哪一个驱动去访问。啊,这里我们不做讨论啊,我们就是以默认的为准。呃,从缓存中去获取数据,可以使用开启啊门面提供的get方法去获取,当然当获取的这个啊K不存在的时候呢,还可以给一个默认值。这两我看一下啊。在test里面进行测试。啊,当然你这边使用的话,它这边是给你高亮了是吧,说明你没有引入这个命名空间,这样我们手动去打一下,让编辑器帮我们自动引入这个fier。He。啊,注意啊。要使用这个catch的这个fighter,这个fighter你不要使用到其他的一个类了,不然的话你调不了它相应的一些啊,伪静态的一些方法。好,这里就有了。那接下来我们先看看第一个情况,就是直接去获取一个K。
05:07
啊,这个K啊,是我们设置的缓存的一个名字。比如我们设置了一个内。看看它存在不存在。请求,Test。是不存在,是有now是吧?好,当然它还可以,呃,给第二个参数,就是使用一个默认值,就当你获取的这个K不存在的时候,可以使用一个默认值啊。看一下啊。把这个注释掉。这也是获取一个缓存啊,不存在的话使用默认值。是不是我们输出来得方塔这个默认值。
06:00
啊,这样去获取这个缓存。甚至我们还可以就是说把第二个这个参数啊,给传递一个B包,而B包返回的结果作为这个默认值都是可以的。啊,在B包里面我们就可以进行其他的一些操作,比如说数据库查询的操作,对吧。检查缓存是否存在,可以使用这个害的方法。检查一个K存不存在,哎,这里稍微看一下。你这有时候会用得着。检查缓存是否存在。啊,我们这个K肯定是不存在的嘛。对吧,负四。接着看递增与递减,也就是说啊,我们使用这个increment方法可以啊,去让一个。啊,缓存去自己去增加一,如果没有的话,他会自己去创建一下,咱们来试一下。
07:05
这里我们让定义一个这个K吧,好让他去增加一,然后接下来我们使用。Get方法,去获取我们的这个number,看一看它的值是多少。是不是一,因为一开始不存在嘛,不存在它是零是吧,我们让它增加了一,所以它是一,接着我们再次访问,再次访问的话。啊,它现在存的是一,我们让它再增加一,它就该变成二,所以这里取出来应该是二,对吧,再次访问一下试试。这个就是啊,自增或者自检在统计呃一些数据的时候比较好用,比如说我们统计这个啊,这篇文章的一个访问量啊,当用户一进来这个啊文章浏览的时候,我们就让这个文章的这个浏览量增加,增加一对不对啊,那有人问了,为什么你不直接去更新数据库啊,假如你并发比较大的一个情况下,比如说你十万人,你同时访问的一篇文章,你去更新数据库。
08:04
那数据库会被就是阻塞。这么大的一个变化,对吧?那么我们完全可以去使用缓存,当你来访问一个呃量进来,就哪怕你十万人,你同时量进来,我只是在缓存上进行操作,对吧?如果我在配合使用这个内存,比如使用做缓存的话,在内存操作是比较快的。这样的话,文章的这个访问量我就,哎,每来进来一个访问就让他增长一,那什么时候去更新到数据库呢?比如说夜深人静的时候,我设置个计划任务,夜里三点没事了,对吧,凌晨三点人少,我让他更新到数据库,进行一个数据持有化,对不对,这是缓存的一个应用的一个场景啊。啊,特别适合就是这种并发性比较强的这种场景,合理的去优化这个啊数据的一个。啊,存储合理的去使用缓存,可以有效的去提升你这个啊网站的一个。抗并发的一个能力啊。
09:02
啊,获取和存储啊。使用啊remember方法,Remember方法呢。它就是说啊,我们定义这个键,然后它如果缓存里面有这个K的话,他就拿这个K相应的数据,如果没有这个K的话。他就会去执行啊里面的这个查询。啊会就说使用里面的数据,在使用里面的数据的同时,它会进行缓存一下,注意和这个做一个区分啊,这是刚才为什么不写它,是我在说他的时候会给大家做一个区分啊。这里先把笔记写一写,自增自减。注释一下。好。获取缓存。如果。
10:01
不存在。就使用。B包返回的数据。同时进行啊这个。我们先看一个这个例子。也就是。上面这个例子。获取缓存,如果这个这个缓存的这个K不存在,就会使用这里面的这个数据,当然我们这里不查,不查数据库了,我们直接返回一个字符串啊,就假定石数据库查询的一个结果好吧。来滴滴这个。WH。那我们获取一个。右侧是吧,假定是用户表。现在我们来看这个value能不能输出这个,Hello啊,当然是可以的。因为他获取这个user,我们里面没有user这个K,对不对啊,如果你不放心的话,你还可以去。
11:00
检查一下这个K嘛,对吧,Has这个K。所以说它使用了。啊,这个字符串,那为什么呃,我要把它拿出来和另外这个对比呢,现在我们把它注释掉。啊。把它注释掉。你再单独的去获取这个K啊,单纯的去获取这个K。啊。你看它的指引能不能拿到,刚才我们已经执行了一遍了,这个对吧,现在我们再刷新一下看看。是不是还是拿不到,说明这个方法就是get,然后他。第二个参数如果是B包的话,就是说我们去取这个K,如果这个K的不存在。啊,他就会使用B包里面返回的数据。清楚了吧?好,这个先注释一下啊。那接着来看什么呢?就是。这个。
12:01
啊,同样的,这里面我们就先不查询数据库了,也是。直接return remember,好,这个是过期时间啊。啊,过期时间我们设置为。嗯,他是秒,过期时间是秒。我们设置为30秒吧,等会方便我们做测试,30秒。它是什么意思呢?也就是说。滴滴下这个位置啊。也就是说使用remember的话,我去访问啊,获取这个K,如果这个K不存在,我会使用这个B包里面返回的这个字符串。同时我会把它进行一下进行缓存和它的一个区别。哎,就是。多了一个同时的数据进行缓存啊,同时。
13:02
缓存。指定时间的啊,指定时间的。数据,因为这里指定了时间嘛,是秒啊。时间单位是秒。关于这个时间单位的话啊。你们在使用这个拉的时候,一定要注意一下,就是这个缓存的这个时间啊,它有一个版本,我记得好像是5.5是就是一个作为一个这个分开吧,就是之前好像用的分钟,在这个五点以后,好像使用的就是秒了,所以你们要注意一下你们拉入使用的版本,一般我们使用最新的版本,嗯。就是在缓存时间这块基本都是秒。好,接下来我们做一个测试啊。首先。刷新是吧,没有拿到这个user,但是它使用了这个缓存的这个数据,对不对,接下来我把它注释掉。直接去获取。
14:00
看一看能不能获取到这个U3这个K。是不是也有对不对。对对吧,所以他会把这个数据进行一个缓存,这就是和这个get的这个比包的一个区别,这个是我们比较用的比较常用的啊,我们经常比如说去啊拿一个缓存的话,如果不存在的话,我们就在这里面进行数据库的一些查询啊,或者其他一些呃,业务逻辑的处理,最终把这个数据反回来,对吧,他会同时对这个数据再次进行缓存。啊。不用我们再去写一大堆的判断啊,Has就是说这个既存不存在,存在的话就使用你不存在的话进行查询,然后再使用这个put进行缓存,一系列的操作就避免了,对吧,直接可以使用这个比较省事。是不是?啊,这个把值返回一下,因为值是是它啊。好,因为这里我设置30秒的过期时间,对不对,现在大概应该是过去了30秒,我们刷一下还有没有,是不是没有了。啊,这是关于缓存的一个。过期时间。啊,接着说一下,你看我们之前看那个配置。
15:01
我们选择文件驱动对不对,文件驱动它是不是存在了这个位置,对这里。来,我们看一看。找到我们的啊。啊。Story是一般放了我们页面的一些缓存啊,Session啊,这些包括页面的缓存,包括我们自己写的缓存在这里啊,找到这个开形看。这里面吗?开启里面data,也就我们的缓存实际上是放在这里面的啊,这里有我们的一些缓存。看到了吧。只不过这个这些目录都空了,只有这一个,这一个缓存。清楚了吗?好。那比如我们怎么去?测试呢,我们再去去设置一下这个,看看会不会增加一个缓存。来看一下。好。可以看到是不是这里多了一个缓存,对不对。啊,你等30秒之后。我先把那个注释掉啊。
16:02
先把那个把这个注释掉。因为我们这里过期时间设置的是30秒对吧,所以呃,你看30秒之后它会不会消失。啊,我们先接着去看,其他的等会我们再过来看啊。好,For就是remember forever,它跟它的一个区别啊,就是不用去设置时间了,它是永久缓存,除非我们手动的去销毁这个缓存。清楚了吧?啊,这个就不解释了,跟它是一样的用法。获取和删除。如果我们想要从缓存中获取到数据之后再删除它啊,可以使用这个破方法。这样的话,就相当于我们把数据给取出来之后,就把它从缓存中给删掉了。它跟get方法的区别就是get方法我们就正常读嘛,啊,每一次访问都可以,只要它存在,但是这个铺只要他拿到了之后。他就会把反正给删掉。行吧。
17:00
现在应该大概过去了30秒,我们看这数据是不是还在,对不对,好,其实这个缓存它并不是说这个时间到了,它就自动把它删了,它是只相当于给他打了一个标记,当我们再次去访问这个K的时候。啊,它会它会检查这个啊,这个这个缓存已经被打上了一个销毁的一个标记,它就会把它销毁掉,来演示一下,我把这个放到这里,然后把浏览器缩小。我在这里我去刷新啊,因为我刷新的话,执行这个代码,我去获取这个K对不对,当我在获取这个K的时候呢,它就会啊,去检测出这个K被打上了一个销毁的一个标记,就会把这个给销毁。验证下来。是不是没了,你看是不是没了。对不对。是吧,好,再做一下尝试给大家看一下。啊,时间的话我就短1.3秒啊。直行这个时候是有这个K的是不是。我们等。这个时间过后,你不管你再怎么刷新这个目录,它它都是在的是吧,所以只有当你再次去访问它的时候。
18:07
其实这个时间时间的话只是到了话给他去,就说标给这个K标记了一下这个销毁。当我们再次去请求的时候,就会把它给进行销毁。看一下。啊,这样,因为目录没有刷新啊,你要点一下它,它才刷新,是不是就没了这个K。嗯,接着呢。呃,给大家演示一下这个就是。获取数据啊,获取之后销毁数据,销毁数据,销毁数据。就是这个方法啊,怎么做演示呢?顺便把刚才讲的这个forever,就是remember给写上啊。
19:02
Remember forever对吧?它是可以永久设置缓存的,就不需要过期时间了,除非我们手动销毁。这里。啊,我用这个。Remember forever去设置了一个啊,User的这么一个K。我现在刷新。看到吗?是有这个K的,然后你在后面,你你不管你去。啊,怎么去获取,比如说开启。Get。这个K。它都是存在的,对不对,只有当什么呢?当我们啊使用了这个。处方法之后,他会拿到这个数据之后。就会把这个给销毁掉。来做一下检测,这里先不写缓存了,因为现在缓存中是有的,我们这里是永久缓存吗?这里是will啊,我再写一个Y62 Y2就等于。
20:02
这个开启get。啊,也就是我先用铺去获取一遍啊,接着用这个get获取一遍,当然这个K要保持一致啊,然后我去分别去打印他们两个,你们看到这个数据结果。是不是第一个有,第二个没有,对不对,就他在拿出来这个值之后就进行了销毁,所以它的获取就获取不到了。清楚了吧?啊,接着看啊。这是关于这个值得获取,接下来我们看到如何在缓存中去啊存储的一个数据,存储的话使用啊put的方法来进行存储,Put的话它接收三个参数。啊,第一个是你要存储的K,第二个就是Y6,因为我们缓存一般都是使用这种非关系型的一个啊方式去存储,就是存K和Y6的一个形式,如果碰到这种数组啊对象的话,先进行一个串行化,把这些复杂的一些数据类型串行化成字符串,再去进行存储。
21:04
行了吧。啊。如果我们不传过期时间就是永久有效。兄弟们一定要呃去合理的设计你的这个缓存。该设过期时间,设过去时间。啊,不要就是说呃,滥用缓存,滥用缓存同样会带来一个反作用的一个效果。关于时间这一块,我们不仅可以使用这个秒数,还可以就是说使用这个。Datetime的一个实例,比如说no是当前的一个时间的一个实例吗?啊,这个辅助函数返回当前的时间,那个实力嘛,让他去增加这个啊十分钟。也可以这么去使用。啊。写一下啊,存储数据。使用那个put啊。这里我给你滴滴一下,滴滴获取一下get我们的这个K啊。
22:03
可以看一下。是不是可以拿到这个值。啊,当然也可以设置一个问题,时间也可以不给。还有一个方法啊,是爱爱的方法呢,它是就是说嗯,如果缓存中我们有数据,它就不再进行去这个设置了,就是说只存储缓存中不存在的数据。存储空章返回处失败将还放,它跟push的一个区别就是push只那不管你缓存中有没有,我都会再给你存一遍啊。就是爱的话,他就说。嗯,缓存中如果有的话,它就不存了。听了吗?拿什么例子来对比他们两个就特别好好理解。比如说我现在。啊,我们设置了一个呃缓存啊,它的这个有效期是十分钟。但是现在已经过去了五分钟,对吧,我如果使用put put,我再次去设置这个缓存的话。
23:03
它又是十分钟的这个K,但是我如果使用I的。他因为缓存中已经有这个K了,所以他就不进行设置,所以那个K啊这个。就是说缓存剩余时间还是五分钟,这是它两个一个区别。永久的一个存储,使用这个啊,Forever。删除数据。从缓存中删除数据,刚才已经看到了一个,呃。这个铺是吧,Push取出来再删除这个吗?取出来删除还可以直接去删除啊,就是说forget遗忘。删除数据。使用这个forget啊去删除,还可以去设置过期时间为零就立马删除了,对吧,或者设置时间为负的。是不是也就呃相当于删除数据了,因为就是立刻过期嘛。这里我们就使用覆盖的方法去销毁啊这个数据。
24:08
啊,当然也可以使用啊,开启的flash啊,清空所有的缓存。清空所有缓存。使用弗兰洗啊。Flash。在之前前面我们都是使用的这个catch的门面啊门面。啊,你看他使用的这个咪咪空间就知道它是一个factor嘛,这里是一个factor嘛,所以使用的门面嘛,对吧。同时还提供了这个辅助函数,其实我们在使用LA里面提供的一些呃门面的时候,你会发现大部分都有对应的辅助函数,比如我们使用sessionin啊,有塞的辅助函数,比如使用那个啊,Root也有root的辅助函数,包括这个catch,对不对?
25:00
啊,使用辅助函数呢。呃,方法跟前面的这些方法都差不多啊,就是有一些区别。比如我们获取的时候。可以给辅助函数去传一个K啊,直接获取。知道吧。获取。完成这这么实用。啊,给他传一个K啊就可以了,那设置呢。设置是给他一个数组。跟我们的这个put就有点不一样了,Put是函数的两个参数,对吧,但是啊。啊,辅助函数呢,是一个数组啊。设置缓存。这里面是一个数组,数组就是K。就像那个Y6,你要设置的这个Y6是这样的啊。跟我们的这个put就有点不一样了。
26:03
哎,这是设置的时候,当然还可以接收一个第二个这个参数作为过期的一个时间。啊,如果开启没有给任何参数的情况下,它实际上返回的是一个这个factory的一个实例啊,也就是。啊。我们就可以使用这个。Catch的其他的一些方法了。他这个factory的这个实例啊,其实就和我们刚才使用那个门面就很类似,听懂吗。如果。不给啊辅助函数。传递任何参数的话,返回的是一个实例啊,返回的是一个开启的实例啊,发的实例。然后你甚至可以使用它的put方法啊,Get方法都是可以的,清楚了吧,就和我们那个门面用法很像,这里我们使用的是啊这个。
27:03
Remember,方法去查这user啊,这是过期时间,给他30秒。比如这里还是。有测试吧,啊是这样的,下面我们在这里去获取这个。这里定义的这个userk啊,是可以拿到这个的。这是使用辅助函数的一个。方式啊打错了。还有一个地方打错了68号。在这里啊。啊,这里打错了啊。好,是不是拿到了啊,这里注释一下,你看我们的缓存又在增加啊。这是使用辅助函数。嗯,看你要是习惯使用门面就使用门面啊,要习惯使用辅助函数啊,就是辅助函数都可以。
28:08
好,其他的暂时我们就还用不着缓存。就先。说到这里啊,包括这个事件什么的,我们后面用得着再说。
我来说两句