00:00
好,我们刚才呢,体会了一下我们这个一级缓存的存在,哎,我们也发现这两次相同的查询呢,我们第二次并没有再去向数据库发送circle了,而是把第一次的这个employee直接拿过来进行使用,这两个呢打印出来也是相等的。所以说呢,我们来仔细的来说一下,我们这个一级缓存。一级缓存呢,我们也称为circle session级别的缓存。那么呢,这个一级缓存,一级缓存是一直开启的。哎,我们没法关闭,哎,我们关闭不了它,那么呢,我们就来说一下,既然是。CIRC session的级别,也就是说一个circlerc session对象,它拥有它自己的一级缓存,新的CIRC session对象,那就是新的一级缓存了。两个一级缓存之间是不能共用的,所以说呢,哎,我们当前一级缓存里面的数据,哎,能不能被使用到,这还是一个问题。
01:06
我们就讨论一下我们这个一级缓存的一些失效情况。比如说呢,我们没有使用一级缓存的情况,没有使用到咱们这个当前一级缓存的情况。如果没有使用到一级缓存的话呢,我们看到的效果就是。哎,效果就是我们还需要。再上。再向数据库发送。发送。发出咱们这个查询。好。来看这个失效情况,那么第一个情况那就显而易见了。我们既然是circle session级别的同一个session对应同一个一级缓存,那你只要circle session变了。不同,那么呢,一级缓存也就会失效,我们来看一下啊。
02:00
我们假设呢,这是第二次查询,第二次查询呢,现在都跟第一次查询用的都是同一个session对象拿到的这个接口。我们来获取新的C,嗯。CI factory。第二,比如呢,我们叫。Get open session,我们来开启一个新的session,这是第二个session,然后呢,第二个session。Get member,我们拿到咱们这个do接口。那么在这个里边,我们来执行查询,执行查询。比如说呢,我们这个102,虽然呢还是查一号员工,但是我们是用第二个session对象拿到的接口查的。用完以后呢,我们也把它关掉。我们来看。这两次之间,第二次查询跟第一次查询是否还会哎。发送SQL语句还是呢,不用发了,来看一下。
03:03
走。诶,我们看这是呢,我们第一次查询打印的employee,第二次查询呢,我们还发了新的SQL语句,因为他们是两个不同的绘画。我们第一次查询的数据只会放在第一次会话的一缓存中,第二次查的数据只会放在第二个会话的一级缓存中,所以说呢,我们第二次查询并不会用到第一次会画的一级缓存中的数据,我们还得再去查,哎,他也没从缓存中拿,拿的是false。这是我们第一种失效情况。接下来我们来说第二种失效情况。那么既然CIRC不同,用不到啊一级缓存,那么我们就来实验CIRC session相同的情况。如果相同,但是我们查询条件。不同。哎,我把这个注掉。
04:01
现在呢,我们还是同一个。同一个session,那么呢,刚才这是,哎,咱们这个呢,S不同的情况。我们现在来到同一个session,但是呢,查询条件不一样,我们再来看。查询条件不一样,哎。刚才是查一号员工,我呢用它来查三号员工。哎,大家说会不会发新的circleq啊,哎,其实这必然是要发新的circleq,因为我们哎三号员工从未查询过,所以说呢,即使一级缓存里边从未有过这个三号员工数据走。所以说呢,我们这个三号员工的数据,诶,你肯定得新查询出来,比如说呢,哎,究其原因,哎,它是因为当前一级缓存中没有这条数据。
05:03
中还没有这个数据。诶,如果你再调用一次这个查询,那么第三个这个EMPLOYEE03,诶你打印EMPLOYEE03,这个零三自然就是从一级缓存中拿的,因为刚才诶已经零二就是查到三号,所以说呢,那么查询条件不同,不用一级缓存的原因,诶我们来看这两个打印就是挨着的只发了,哎我们这两条色扣不是三条色扣。也就是说呢,它的根本原因,查询条件不同,没有用一级缓存的根本原因就是因为哎,我们这个数据在一级缓存中还没有啊,这个我们应该能理解。第三个。我们得说一下。如果相同。但是看好啊,我查询期间。查询,两次查询之间。
06:01
执行了。增删改操作。会是什么效果呢?好,我们来看啊。还是查询一号,我们这一块呢,也是查询一号,我们都是查询一号,但是在两次一号查询期间,我执行一次增删改。我调用member点假设呢,我就添加一个员工。添加一个又一个employee对象,好,我来添加一个ID自增,不用管,哎,我们就叫test这个catch。没。看啊,真的一我们来添加一个数据,那么数据填完了以后呢,我们来打印一下。数据添加。成功。成功。好,我们来看啊,我打印一下它,我们再来进行查询。走执行了任何一次增删改来看。
07:00
好,这是第一次查询一号员工,哎。与第二次查询,我们发现他发了新的色谱,他们中间夹杂了我们这个数据添加。诶,两次查询虽然都是一号员工,但是我填了一条员工数据。他们呢,就要发新的S,其实这个我们也应该想得通,为什么呢?因为这次增删改可能就会改变我们这条数据,这次增删改。可能对咱们这个当前数据有影响。哎万一,哎万一呢,我把这条数据给删了,我这次呢,我刚才测的是添加,我现在呢,结果测试删除,把它给删了,或者呢,我把这这条数据给改了,你就不应该拿之前的数据作为数据库里的数据让我看,所以说呢,执行任何一次增删改,哎如果是我们的想法,理应也是这么做的。
08:02
哎,只要数据库有变化,我们再去查询新的数据。也就说呢,马威蒂斯也是这个思想,哎,只要执行了增删改,哎,我们就会,哎进行再次查询。我们再来看啊。如果第四种情况相同,但是我们直接手动。清楚了。那咱们这个一级划算。荣呢,我把一级缓存中的东西给清空了。缓存器清空以后呢,那么自然就没什么数据了,哎,我把这个。把这个除掉。好,我在这两次查询期间都是一号员工。我把缓存清一清。Yeah。哎,不是不是,是我们这个轻缓存,我们要调用open session点有一个叫clear catch,好。这次的话呢。
09:01
把刚才第三个注释拿过来啊。第三个在这儿好,这次我们第四个操作,我们清了缓存,还是查询一号员工,两次都是查询一号员工,看会不会再发第二条。走。哎,我们看。这是呢,我们查的第一个一号员工,第二个一号员工虽然都一样,但是两次查询之间我手动也清缓存了,这样的话呢,我们当然后边的查询就需要哎新查询了,因为缓存中已经没有数据了。好,这就是我们缓存失效的这四种情况。其实我们说的这个一级缓存啊,就是我们这个circle session级别的一个map。就是说呢,我们把所有当前circle session查出的数据都会放在这个map中,然后我下次查询,如果还是当前会话,我先看这个map中有没有,有了我就拿,没有那我再去。
10:04
这样呢,就能减轻我们数据库的负担。
我来说两句