00:00
一样啊好,那接下来呢,我们来看一下,其实这里边比较复杂的就在于优化,我们还做了两层优化对吧?第一个我们加入这个旁路缓存,所以旁路缓存指的什么意思呢?我们看这张图对吧?呃,那比方说我们维度数据呢,存在这个Phoenix。对吧,现在这是Phoenix啊好,那假如说呢,我们订单宽表,他要去关联数据,关联数据我们呢,先查缓存。啊,我们加了一级缓存对吧,我们先查缓存,如果缓存有了,那是不是直接从缓存返回数据就好了,对吧,毕竟这块是一个什么内存数据库吧,大家典型的能想到我们肯定要用谁做这个事了。我们要用谁做这个事儿啊,这一块的缓存。对了,我们所学过的只有red吧,哎,所以呢,我们要用RA做一个缓存对吧?好,那red缩据怎么来呢?假如说。
01:08
布隆过滤器啊,不行啊,这个地方用不了布隆过滤器,因为布隆过滤器是一个概率的。是一个概率容器啊,这块我们必须要找到这个数据到底有还是没有啊,而且不是说有还没有的话,我们必须要他有才可以,对吧,这个地方并不用到布隆过滤器啊,不是的啊,好,那我们就查这个数据,有的话直接返回,如果没有的话怎么办?没有的话我们是不是还只能请求到这个Phoenix。对吧,请求到菲利斯菲利X长边数据之后,注意不要着急返回,不要着急返回对吧,先写到什么缓存里边,哎,这第一次读嘛,第一次读的时候我肯定没有。对吧,好,但是第二次再访问的时候,我这个就怎么样。就该有了对吧?啊就该有了,是这个意思啊,这个能不能理解。
02:06
这个能不能理解啊,加这个盘中缓存这个应该没问题吧,对吧,就加了一层red作为我们的一个缓冲层啊,然后呢,查的时候先查red,再查Phoenix,如果red有了,那就不查phoeni,那就更快一点嘛,对吧,效率会高更高一点,因为毕竟你这个数据呢,就算你有这个读缓存写缓存,乱七八糟的,呃,毕竟你的数据还是存在HDFS,而我red这个数据存在。还是存在哪的。存在内存当中的对吧,起码比你这边的速度呢,肯定能快一点啊,肯定能快一点,好,这是整个的一个思路,并不难理解,对吧,那接下来我们要考虑的是这个事情。有两个点注意一下啊,呃,比方说有一个用户啊,这个用户维度对吧,他今天购买了一件商品,我们是不是就会访问Phoenix,把这个用户信息写回到里边,没有问题了,好,这个用户呢,可能接下来。
03:09
很长时间都不买东西了,有这种可能性吧,不去下订单,或者说不做任何的业务操作,只是说上来浏览浏览,没有任何的业务操作,有这种可能性,对吧?好,那你觉得这个数据还有必要放在当中一直存着吗?有没有必要放到一直存在这个数据啊?对了,并没有必要,所以在当中我们是不是可以对这个数据设置一个过期时间。
04:05
对吧,啊,过期时间。好,那并且同时呢,我们还要如果在假如说24小时啊,我规定24小时对吧,假如说24小时范围内又访问了,我们是不是应该跟我们之前看到那个状态一样,我应该重置它的时间为24小时啊,就是说这个数据呢,如果被读了,我们是不是也要重置,不光是写。是不是如果说这个数据被读了,我们也要重置时间对不对?没问题吧,只要他被读了,因为属于热点数据嘛,我们相当于把热点数据放到了RA啊好,还有第二个问题,第二个问题来看这啊,第二个是什么问题呢?比方说我们现在啊,读了user id143。
05:02
143这条数据对吧,这条数据呢,是不是在这儿存着。在这存着好,然后呢,它性别刚才我们看到是一个,呃,Female啊,或者说是ma也可以啊,无所谓,反正性别假如说是一个没吧。前面是一个mail啊,那这个数据呢,在24小时,如果说没有人访问它至少得存24小时,这个是刚才我们说的对吧?呃,那接下来呢,有没有可能我们数据呢,做了一个修改,这个用户啊,对吧,做了一个修改,他可能把邮箱改了,也可能是去了一趟泰国,然后性别改了。对吧,好,那如果说这样的话,接下来他再去购买东西,他应该以这个非妙的性别。是不是对吧啊,他去了一趟泰国回来了,性别变了啊啊,但是呢,24小时之内,我们这个数据怎么样都不会变吧。因为我们只有从Phoenix查出来数据以后,再同步到缓存里边。
06:04
才会同步到缓存里边,所以当你访问了一次数据之后,立马把这个数据改了,我是不知道的啊,所以呢,还要做另外一个事情,如果维度数据发生了变化,如果它发生了变化,那我们要把这个。干什么事呢?把缓存清了。把缓存清了,这个是为了保证Phoenix跟之间数据一致性,这个有没有问题,第二个点有没有问题。如果不做这个事,是不是数据一致性没办法保证了?对吧,啊,要保证两边的数据呢是一样的才可以啊,这是第一个注意点啊,第二个缓存的一个选型啊,那一般有两种啊,第一种呢是堆缓存,另外一种呢是独立缓存服务,呃,对缓存呢,就是相当于我们可以在这个代码当中去加一个map。
07:09
我加一个哈希map。对吧,我可以给它加一个哈希map啊呃,加一个哈希map,然后呢,ID作为K,然后呢,值就是我们这一行数据传成VALUE6,那这个呢,代码当中加了map叫叫做堆缓存,那独立缓存服务呢,就是我们所学习的red memory catch啊等等这些东西啊,那独立的一个服务好,那他们俩各有什么优缺点呢?比方说堆缓存性能肯定更优,因为在内存当中,在我们代码的内存里面,我都不需要连接去访问它,对吧,直接是一个哈希map,呃,访问数据中径短,减少过程消耗,管理性差,因为其他内存就获取不到,这是第一个,第二个一旦你挂掉了,是不是就没了。我把这个任务停掉是不是就没了,它的堆内存就没了吧,对吧?啊,所以管理性上比较差,独立缓存服务呢,呃,它的性能还还OK啊,毕竟是内存嘛,但是呢,会创建连接网络IO。
08:10
对吧,好,我来,但如果说你任务挂掉了,它不会丢,它不会丢啊,你任务挂掉跟我red没什么关系,对吧?同时由于是独立缓存服务,所以呢,这边承载的数据量可以更大。啊,可以更大,而且独立缓存呢,更容易扩展,我可以好多人都来访问,对吧,如果说你用的是哈希map这种情况的话,假如说多个服务,比方说我订单业务线。是不是要用户。对吧,好,我支付是不是也要用户,也要用户啊好,那家来还有其他的各种各样的业务线是不是都可能要到用户这个,那我如果用release,我是不是存一份就够了,那如果说用这个对应缓存呢?是不是每一个进程里边都要维护一个独立的这么个缓存,也就相当于每一个用户存了四次吧,假如说有四个业务线用到是不是用到四次。
09:11
能理解这两种之间的区别吗?一个堆缓存,一个独立缓存服务OK吗?这块啊,我们一点一点的解决这个问题。好,呃,那这是我们说的啊,但是有的公司呢,为了更快一点,它会把这个对缓存跟独立缓存服务联合起来去用,联合起来用,也就是说在这个中间我再加一个二级缓存。这个呢,用堆缓存来做,对吧,往往来说都用的l ru catch。用的都是这个I cash最近最少使用,也就是说呃,它存的是最常用最常用的热点数据,我给他放在当前的这个内存里边。
10:04
对吧,有的工作量在这个之间啊,在这个基础上,呃,再加一层本地缓存,我先访问本地缓存,本地缓存有了直接返回没有,我再访问一下red,有了把这个数据写到这来,对吧,再返回。啊好,Red还没有打缝着了,然后呢,写入red写入本地缓存啊,就这个意思啊,就是本地缓存,在本地搞一个这个,呃韩信map啊,其实那个L开里面用的就是link的哈,信map啊,用的就是数据结构,就是link的信map啊好,那这里边呢,我们其实也没有必要这么复杂,除非我们数据量,这个数据量特别特别大的时候,我们可能会做这样的事情,但是现在呢,没必要对吧?好,这是我们优化一的一个思路分析,加这个旁路缓存啊。
我来说两句