00:00
然后接下来我们聊一下这个数据的一个读流程啊读流程,因为刚才我们说了这个数据会刷写到磁盘对吧,那将来读的时候是不是有可能会读到磁盘对吧?啊来也就数据它有两块内容,一个memory做一个是什么。不是两块吗?都有可能存数据吧,那这两块是不是都要读啊,来看一下那大家的想法是啊,等会我们聊啊,呃,首先呢,现在又多了一个什么。比刚才组件又多了一个block catch,因为这个block catch是什么东西呢?叫读缓存。之前这是不是还有一个block?还记得吗?对吧,这个是客户端缓存原数据的,而这款block catch是缓存实际数据的,就是你缓存的是张三李四的一些东西能听懂啊,两个缓存不一样,好,那接下来我们来想一下,首先你要读一条数据,假如说还是读SU1005这个数据。
01:02
那你要读它,是不是要先定位到它呀。那怎么定位啊,第一次先从当中。去找me达表所在对吧?啊把返回了,那接下来去读取me达表给它返回了,把原数据信息写入缓存对吧?啊,原数据这个跟写操作是不是一样的,那你无论是读写,你是不是要定位到它呀,好找到它之后,假如说还是在103。那接下来它是不是跟103发起请求,好请求到这块来了,我们现在已经知道了这个数据啊,再内存,再磁盘,还有一个我说的开叫读缓存,大家现在看到这个想法应该是这样的,我来分析一下啊,大家的想法是先读内存,内存有。干什么?读回来直接返回了,好第二个内存没有内存没有主磁白磁盘读到了放到开。
02:02
总要用block catch吧,对吧,是不是这样想的,Block catch,因为你磁盘我总跟磁盘打交道,不好吧,我常读的数据我可以放在catch里边,对吧?啊这里边呢,遵循一个规则叫那个。听过吗?也没有听过是吗?最近最少使用的一个算法。叫最近最少使用,因为这样啊,我们来分析下这个逻辑,因为它跟磁盘打交道。是不是比较慢啊,所以我提出来一块缓存,说存最近经常读的数据,但是我这个内存大小是不是有限的呀,我不能说无限的存吧,把所有的磁盘数据都加载好,假如说我给他的是100兆。就将来你存100兆,是不是超过这个100兆,你就深一些东西啊,删的东西就是遵循最近最少使用的一个规则啊,就是尽量的把最近经常读的数据放在内存里边,因为最近经常读,可能下一次还要读它吧,加速的啊,这个里边呢,遵循一个L开的一个L开。
03:09
开场。L最近最少使用啊,就这个算法,其实它就是一个link,还只过给了一个阈值,然后就是你要写这个删除的一个算法啊,写删除的一个算法好,那不管怎么样,它是不是帮助我们缓存数据的。对吧,缓存的,而且呢是张三李四这种实际数据,那我们刚才接着思路走,大家的想法一定是这样,先读缓存嘛,因为你这块也是内存是吧,我读它的时候。需要跟你打交道吗?不需要,两个都是内存,没必要,你说把这个内存读到这里边有必要吗?没必要,所以大家想法应该这样,那你发送请求来了,我先读内存。对吧,内存读完了之后。发现没有读什么。好,如果没有,那就返回空了。对吧,假如说他没有就返回空了,好,如果说有呢。
04:02
是不是我们想法把它写到?Block catch,然后再做返回,那下一次来的时候内存如果没有是不是先看一下block catch catch有是不是直接返回,大家的想法是不是。大差不差吧,一定是大家想法是这样的,先读内存,再读400嘛。这很合理是吧,但是不好意思,对于来说是错的。来,如果按照大家的思路来说,举个这样的例子。我在A时间点。出了一个1001什么name啊。应内招三。注意啊,在这个我这样,我把它变成什么呢?变成一个白板A时间点。我做了什么事呢?啊,那张表肯定是一样的,OK吧,你往不同的表里做的就没有意义了,是吧?啊啊1001,然后接下来啊,接下来是有那个音付啊,然后是name啊name好张三。
05:09
我给他写进去了。经过了一个小时都没有写数据,那这个数据是不是已经在磁盘了,有没有问题,没问题吧,或者说大不了等会我们做测试的时候,我手动给他刷下去行不行,对吧,也就是说我要这条数据的磁盘。接下来我做一个事情,我put一个数据,这个数据呢是1001还是name是李四。就是这两个什么这个表啊,Rookie啊,这些东西都一样,只是最后的value链不一样,但是这个时间桌我自己传进去的。B,且。B小于A,那我在查,你告诉我。返回的数据应该是。是不是张三?
06:01
那你再想一下你们所理解的逻逻辑。你想一下,你们读的逻辑是不是返回A是才是合理的。对吧,返回A才是合理的,按照我们所说的时间戳嘛,那怎么能返回A呢,是不是他要把内存跟磁盘都读出来做一块比较能听懂。对吧,我们做一个这个实验来。这实验不很简单吗?就是告诉大家不要看到有内存有磁盘两块东西,而且是内存刷下去的,就理解为。是先内存后磁栏,因为这个里边它是用时间桌控制的,如果说没有时间桌控制所有的数据,真正的当时是做了覆盖的情况下,那是可以这样的,因为他用时间桌控制的,那也就是说刚才我们所做的一个事情是这个样子,来看一下啊,并是不是下进来对吧?我创建一个新的表,我不跟之前的表冲突,因为之前表可能有参用数据,对吧。
07:03
来看一下之前的表。来,在这吧。来这。Data塔对吧,是T吧,昨天我们看到是不是这个叫这个叫什么,还记得吗。微的名字吧,还记得吧,啊的名字,因为有可能有多个一,诶这底下就有什么了,昨天看什么没有啊对吧,因为今天早上起来了,首先你关闭的时候关闭比较慢,是因为他要把内存的数据都干什么都写下去啊,都写下去,而这意思啊啊就算他昨天没写到今天为止也过了一个小时了吧,我也之间一直没有操作过,他是不是也应该写下去来啊,也应该写下去了,好,那我们不管啊,因为这个呢,有写的数据,我们不希望这个数据干扰我们,OK吧,我再来一个SQ什么。这是不是有ST?那就二,我再来一个三可以吧,啊,再来一个三。
08:06
哎,三对吧,三,然后我还是一个列组,你做列组OK吧,好过。呃,那这个时候我们有了,那接下来我往这里边去put一个。STU3里边呢,放一个1001逗号,然后是in four冒号name对吧,然后呢,我们还是按照我们刚才的一个逻辑。逗号先放一个什么张三OK吧,好,先放一个张三,先放张三,呃,那我得那什么啊读一下,因为我要拿它那什么使间戳对吧?啊,拿他这个时间戳S3。好,我为了拿这个东西,现在老师有什么事呢,你看现在他会在磁盘吗这个东西。进来付一个度啊,不可能再下班吧,来手动干什么,刷新一下啊,之前我们是不是看到有拉命令。
09:02
对吧,三走。刷写下来一个数据吧,啊刷写下来一个数据,OK,那这个数据从内存已经到了哪了。400啊,那怎么证明这条数据就是呢,它有一个命令啊,有一个命令我们来搜一下,因为那个命令比较长啊,这直接。直接叫读取H。为什么这个怎么这么麻烦呢?你们有见过这种吗?这个也太麻烦了吧,之前没有啊。来,其实它可以直接读取H刷写下来了,这个东西我们这边说了,它不是以HL形式存储的嘛,你直接开HDF开不了,开不了你看不懂的,对吧?啊,我们找一下这个命令啊。H,哎,这个地方没有这个命令。
10:01
我一下。嗯,读取它的一个这样吧,读取F命令。因为这个东西其实比较少用,就是为了让大家看一下这里边儿确确实实是刷下去的什么。内容啊,刷下这内容,嗯,我们看一下读取H命令。我看一下。是H的一个命令,通过h base去加载的,然后里边用杠H-K啊,乱七八糟的东西比较多。其实这个东西比较少用,因为就是想给大家看一下那个内容。这样吧,我重新搜一下H叫。命令。好,直接读取。文件表文件,哎,这个啊。这有啊。嗯,这个地方。
11:02
这个地方,呃,我看一下杠。Check family enable check,然后print blocks打印块信息,那我们把所有参数都加上吧。对吧,啊,所有参数都加上一个。应该没问题啊,所以30多家长,因为他没有举这个例子啊,之前我看到有一个举这个例子,我再找一下,应该有一个举这个例子。呃,他还是讲的里边的一个快内容,然后。还是讲这个是怎么存的,对吧?S这个文件格式,那我们还是用刚才那个,我把所有的命令都,所有的参数都加上不就完了吗。呃,贝斯这个内容来。H fair h,我看一下后,然后是BH加上一个这个参数吧。把这个粘过来啊,我把它拼接一下。
12:00
OBD model。然后把这个粘过来,然后跟上几个参数,我们挑几个要的,呃,杠A对吧,杠A-B-E。杠A、杠B。K,我记得是要的差个肉啊,就因为我差个肉,总共他的校验那个内容,OK,那就杠A-B杠一杠K-F对吧,有人记得吗?杠A-B杠什么。E是吧,杠K,然后杠FF后面呢,要跟着这个内容。之前我记得搜索的时候是有一个内容。看一下能不能读到。呃,里边的数据没给我们拿出来是吧,这只是那个校验信息啊,等于1OFF里面是对count等于一一条数据啊,拿出来了吗。
13:04
那这个内容吧啊,Put是不是put这些东西啊,但是我们没看到那个张三啊是吧,数据就Y6没给我们拿出来,应该还少一个参数,我们看一下啊。干什么?不是这个to啊杠吗?对屁屁加屁。对,所以说找到这些参数,你像这些参数谁去记啊。记不了啊啊,这些东西怎么记啊,没必要记啊,就是用到的时候就搜一下这个东西,加一个东西不好加吧。对吧,在里面加暴加,我在前面加一个加个什么。个屁对吧,屁给他拿。哎,这个弄错了。就能看到这个东西实际的已经到了文件里面。张三,有了吧,啊,Y6有了这个呢,就是我们看到的这个数据啊,数据已经文件,我们直接对着读取这个文件吧,啊,它是以这种KV形式存的,我之前说过这是一个file文件,对吧,所以你看啊,他读的时候要用那个什么。
14:11
还贝尔的一个类吧,还贝的类是用到这个什么还贝这个命令来读的,首先是不是说明这个数据已经刷起下的,这没问题吧?啊,做了这么多就是为了证明这个事儿啊,确确实实是张三写进去了,只不过说呢,我们额外又打印了很多这个校验信息,对吧?那执行命令的时候又打印了很多日志啊,很多日志啊,好,那这个东西已经刷写下去了,现在我再获得一张数据。第二。往上翻库的数据呢叫什么?李四,但是呢,我给他一个时间戳。20。好,现在你看这个地方。还在干啥?把这个干掉对吧,我刷新。是不是还是一个文件没动过吧,这个文件没变,OK,那现在这个文件里边是不是张三李四在哪?在内存,如果按照我们之前所理解的先读内存,内存能读到这条数据就不走磁盘了,那返回值应该是什么?应该是什么第四吧。
15:18
返回值是什么?张三?啊,张三。是张三啊,那有同学可能想你这个是不是客户端缓存呢。有人会想这个问题吗?没有人想这个问题是吗?你如果说有人想这个问题也可以解决他。这样,因为我大致的知道这个时间,我等我把这个六改成五,我总比那个小了吧。对吧,啊,我再来一个时间,我就不看那个时间,我就就是插入一条数据flash下去之后,我不读这个数据。我不没有读过,会有什么缓存吗?没有吧,读不可能在读缓存里面有吧,现在因为我之前是不是为了拿时间说读过一次。
16:03
是不是有可能放在大家的理解,放在主管,你你可能放在主管的里边,没有走那个什么磁盘,对吧,还是没有走磁盘,那这样我做这个操作啊,现在因为我已经拿到这拿到过时间戳了,我等会把这个时间抽呢,我还用这个时间戳,那一定比我现在操作小对吧,那我现在呢,我不用name,我用什么。我改一个叫对吧,Sex呢是。没有。裤子,OK,走,然后呢,我把这个数据干什么,Flash下去。三走好,现在这个地方就会多一个什么。文件你看它还要稍微大一点,稍微大一点是不是有两条数据啊,这里面李四和什么。这个内存当中数据都刷下去吗?是不是有李四和刚才那个mail啊,啊稍微所以说稍微大一点嘛,这很合理,当然它里边还有因为是HL,所以它还有头文件啊,那些东西比较多啊,所以呢,他整个的文件你尽管一个张三也存到4.8K吧,啊这是这个意思,好,稍微大一点,这是合理的,那接下来我做什么事?
17:10
我都不这样做,我直接CTRLC,你不是说有缓存吗?来。我客户端重启一下行吧。是不是肯定没,而且我也没有读过这个,没有读过这个没了吧。是不是没有在磁盘我没有读过吧,而且我客户端已经干什么。重启了对吧,我再来的一个什么。三。1001。什么,然后呢,叫飞。走,然后我去干那个什么。返回值是飞秒。哎,对,我没有加时间出哦,这个很尴尬哦,呃,这很烦哦,为什么为什么不提醒一下呢?刚想说是吗?呃,93102我用可以吧,呃在记得记得。
18:18
那。李四,这个可以不带时间,说吧,走。然后干什么?三走,然后重启客户端吧,啊重启客户端还是说刚才操作在在记着记着在时说。呃,把这个东西干什么。拿过来这个来一个,王对时间说,我,我现在肯定记得了。时间说,哎,我这个时候直接写这个S时间戳。各位一定比这个李四小吧,这没问题吧,好。走现在是不是这个王五在内存,李四在400。
19:10
是不是出来李四对吧?啊出来李四这个说明什么问题啊。读的时候并不是像我们理解的,先读内存吧,再读什么,因为内存里边有什么。有有是不是有网五啊,内存里边有网五啊,但是磁盘里面有什么。有李四对吧,但是最终返回值是李四,因为李四的时间戳。大对吧,因为李四先要大,所以说这块说了这么多,就想告诉大家这块你看到内存跟磁盘不是说先读内存后读磁盘,而是两个干什么一起读,读过来之后要做墨制,墨制过程当中比较的是时间戳,返回最大的时间戳等等的意思,因为X这个框架它的设计的时候跟其他存储框架不一样。它这个内存跟磁盘利用的不一样,因为它是完全看这个什么时间桌来的,对吧,完全看时间来的好,那每一次都去扫描这个磁盘是不是速度太慢了,所以他加了一个什么。
20:10
我捞个快。从磁盘读出来的数据,我就放在这个读缓存里边了。方便下一次使用能听懂啊,这个不拉开,也就是说它真正读的过程,发送请求之后,接下来做什么事同时读他们俩。磁盘和内存数据对吧,磁盘和内存数据好,然后磁盘的数据读过来要放到这。然后内存的数据呢,也给它加载过来,加载过来把这两份数据搁一块儿做一个。墨指啊,我们把它称为墨指啊,叫做合并,那这个合并过程实际上就是比较时间桌,最后给客户端返回。时间中最大的对吧,因为我们刚才说了,这个必须要给大家解释清楚,因为大家先入为主的想法,一定是想着先读内存后读磁盘对吧。
21:00
之前大家想法是不是对吧,先读内存,因为有内存跟磁盘嘛,所以呢,刚才我做了那么长时间的一个案例,就是一定要打消掉大家对于这种一个观念,对吧,它是磁盘跟内存干什么,他一起读的,读完了之后要干什么事啊,把磁盘的数据要写到这个读缓存。啊多缓存是这意思,好,那由于这个图片是直接这样先出来对吧,因为如果说正常的读缓存已经开启了,它是不是先去磁盘读磁盘之前先访问一下读缓存啊有的话,如果说这个里边有的话,他还是读磁盘吗。这个不读了,因为它是磁盘的数据给它加载过来的,能懂吗?这个是不会有什么问题的,因为他是哪个读缓存里边对吧,你要注意啊,是这样的。如果说你新刷了一个数据下来了。文件名都变了,他是按照那个文件名存的,那个文件名没有,他要去读,能听懂这意思吗?确实你说的不是最新的,假如说你的103张三刷在A文件,李四比他新刷在B文件,但是在李四刷之前,你是不是读过一次这个A,这个东西是不是写在这里边,那同学你你刚刚说的意思应该是这样,就是说可能磁盘里边有B这个数据,对吧。
22:20
因为它不是一个文件了,不是一个文件,这个block catch是读不到那个文件的,他要去读其他的文件能听懂,它仅仅是针对于这个文件,它不扫描的。不是说整个磁盘不扫描了。没听懂来。这个里边是不是有张三对吧,这个里边有例四,这个没问题吧,刚才我们说的好,接下来是这个问题,刚才那个同学说的这个意思,因为我讲的是这个点啊来。我我刚才说的,如果说我去访问1001。那条数据。它是不是在内存当中没有注意啊,先是第一种情况,它它还不存在的时候。
23:03
就是李四还没有插入的时候,OK吧,现在我来读这个数据,它是不是已经刷到磁盘了,所以它内存加磁盘同时读,最后把这个张三放到了我们刚才说的block catch里边,有没有问题,这个没问题吧,刚才那个同学的意思是说,诶,我新进来一条数据也flash了。这个李斯在磁盘了,我之前是不是说过block里面有不读磁盘了,我是不是说过这话没问题吧?好,我说的是什么意思呢?是针对于磁盘里面这个文件不用读了。因为你缓存的是关于这个里面文件里面什么张三的数据能听懂讲那个是你其他的文件,你该扫描还要扫描啊。因为我就像我们同学所说的,我有新数据进来,其他的文件里边有没有我知道吗。你block里边有缓存这个这个文件数据吗?没有吧,你这个文件照样还要读,能听懂。这个能听懂吗?只是说单独的你缓存了哪个文件的数据,哪个文件就不用读了,能听懂,你新这是你最新刷写的数据,那你读的时候肯定还要读嘛,所以无论怎么样,他都会去读什么。
24:12
400,而且数据量大的几乎是做的什么。全部都扫描,因为你磁板里面存的数据可能到十个G,但是你不捞开始能存一个G嘛,很少吧,你开的缓存基本上基本兆就差不多了,所以大量的数据还是要走磁盘,是干什么去读,所以我们之前提到一个点,这是一个读比写慢的方向,是因为他读无论如何都要干啥走磁盘,除非是我们当前这种情况下,数据量比较小,你做了一个全场扫描,他全部把这个数据放在环境里面,能放得下,他就不走磁盘了。所以我们在查的时候,多次查询是不是很快啊,十几条数据也很快啊,因为他在读这边做了一个什么读缓存啊,做了一个读缓存,因为它整个的读都要扫描这个磁盘,所以它本身很慢,所以他用一个磁盘来加速它这个查询,能理解这个事儿。
25:04
OK吧,啊,他是这样做的啊,大家这样做的,所以刚才我们所做的一个事情,就是为了让大家知道这个地方,你不要看到内存加磁盘,就认为它是先读内存后读磁盘,它是两个干什么。同时读到啊,同时读到,只不过说为了加速这个磁盘那个读的速度,他做了一个block开啊,你要注意开仅仅是对磁盘里边文件生效,Memory的数据读出来不会放到block能听懂,因为本身内存block也是内存,我有必要说从这个内存放到那个内存让你读的快一点吗?没必要吧,对吧,合并还是占内存,不是这块内存。不是block啊,Block呢,仅仅是放什么?磁盘文件读出来的那个数据啊,读完张三啊李四啊,读的这种数据能理解这个事吧?啊这个要注意一下,就是刚才做的一个例子对吧?啊例子可以证明它是同时读到,因为最终我们返回的是哪个数据啊,是不是磁盘里面数据啊,如果按照我们理解的,这边有王五,这边有李四,那按道理来说应该返回王五,不应该返回第四吧,对吧?啊所以呢,这块要注意一下,它是两个同时读的啊,不会读的,这是我们所说的整个的一个读的一个流程啊,读的一个流程,所以这块呢,他都要去扫描这个磁盘。
26:21
啊,扫描这个磁盘,所以就会导致他整个的会什么呀。慢吗?啊,会慢啊,是这意思。
我来说两句