00:02
大家好,欢迎大家继续收看上硅谷的Linux云算视频,我是刘川老师。那我们本节课呢,来讲一个数据库方向的,关于RA相关的这么一个面试题,那呃,数据库呢,我们分为关系型数据库和非关系型数据库。关型数据库呢,我们讲的典型代表呢,就是MYSQL,它毕竟也是一个开源的,而且在生产环境中应用范围相当广的这么一个数据库,那非关系型数据库呢,也是近些年特别火的,而且应用场景也越来越多的这么一种数据库了,那我们呢,就讲一个和我们生产环境中。呃,这种契合度相对比较高,而且应用频率比较高的,那么一种服务器叫做OK,那首先我们来看一下题目。那我们呢?常遇到的和RA相关的问题,其实就是关于如何进行永久保存数据,OK,那这个问题其实问的呀,如果是不懂的人啊,其实很难去理解这个题目,原因是,那难道数据库这个东西不是永久保存吗?为什么我们还要做去做永久保存这个事儿呢?是这样的啊。
01:08
关于radi呢,它的默认保存机制是保存内存里的,这个相信大家都应该都知道,所以说呢,我们是想办法如何让它把保存在内存里的数据而保存到文件里边,以此完成一个即便突然出现这种什么这种呃。断电故障也保证我们的保存在内存里的数据不会丢失,那这种东西呢,其实我们也一般称之为叫什么呢?叫持久化。啊叫持久化,所以说呃,一般情况下,如果有人问到了呃,关于永久保存数据或者持久化相关的问题,其实问的就是我们这个问题,OK,那么先来看一下我们的一个分析内容。对应的呢,首先我们要先去了解的一个工作原理,然后呢,我们再来说release的一个持久化的,就说永久保存数据的这么一个方案,OK。
02:01
首先第一个就一个介绍了。那RA呢?作为一个这种非关系性数据库,它的存储方案是使用这种叫做k value键值对的方式进行数据存储的,注意它是使用的一种叫做键值对的方式进行数据存储的,那。它和我们MY的区别在于它没有MYSQ那种库表结构啊,或者说不一样的库表结构啊,不一样的库表结构,那并且呢呢,所支持的value的类型呢,相对比较多啊,我们有常见的有什么string类型,List类型,Set类型,The set类型等等等等。我们同时支持对这些数据类型进行的一些操作有非常多,比如说po pop ADD remove,以及交集、并集、补集等等操作,OK,那这就是我们对这个RA数据库的一些数据类型的一些认识,以及对数据的一些操作,OK。那而且这些操作呢,都是原子性的,OK,这个地方简单提一下原子性,原子性这个东西呢,其实在我们的关系型数据库里边有一个相似的名词啊,有一个相似的名词啊,我们呢,这个东西它的主要作用是为了提高我们数据的一致性啊,提高数据的一致性,比如说简单打个比方啊,简单打个比方。
03:24
这个时候呢,小明呢,手里有100块钱。然后呢,小红手里呢,也有100块钱。这个时候啊,小明要去商店里买一个商品,这个商品的价格是150。但是小明只有100,所以说小明买不了这个东西,那这个时候我们要怎么做呢?小明铁定要向小红借。钱,那借钱借多少呀,只要借够足够就可以了,一般情况下这个时候。小明要向小红书那个能不能借我50块钱,我要买个东西,我这还差50 OK。当小明向小红借钱的时候,这个时候我们的事件就开始了啊。
04:03
我们称为事件就开始了,那小红首先他的第一步就是先在自己这100块钱里取出50块钱来,相当于就是100减50。那他自己还剩50。OK。那这个时候小明会接过小红借给他的100块钱来,那就是100加50。最终变成150。大家来看一下啊,大家来看一下,我们来衡量一下这个事件在发生前和发生后的一个变化,事件发生前小明有100,小红有100。事件发生后,小明有150,小红有50,但是他们有一个共同点,就是他们两个的和是不变的,小明和小红在事先加起来是200块。借完钱之后,他俩加起来还是200块,那也就是说整个事件完成之后,他们的总和或者外观看起来上是不变的,这就称之为叫原字形。
05:01
对于数据库而言,就是如果我们要对某一个数据内容进行修改,一定要把这个数据完完整整的都修改完,才算是完成这样一个事件。如果只修改了一半,那这个时候事件要退回到事件发生之前。保证不能事件只处理了一半,而另一半没有被处理,这种事情是不可以的。那就给你举一个最简单的例子,你去银行存钱,然后呢,你把这个自己的钱递给了银行柜员之后,柜台之后,结果柜台那个人没有把这个相应的钱数给你什么修改到你银行卡里,那钱银行是不是留下了,但是你的这种现金和银行卡的总额加起来是变少了,那你愿意吗?肯定是不愿意的,所以说我们数据库的数据变化一定是要符合原子性的。啊,一定是要符合原则性的,也就是说事物的处理一定是要完整的,一定是要从头到尾完整的,那如果说万一我们数据处理的时候没有处理完怎么办呢?我们有一种东西叫做回滚。
06:06
啊叫做回滚,回滚的操作很简单,就是比如说诶,小明说要借小红100块钱,小红把这50块钱往外递出去了,啊往外递出去了,但这个时候呢,小明没接。那小红就要把这50块钱拿回来,为什么他俩要保证他俩的和加起来是200块?如果小小红递出去了,别人接走了,那小红和小明加起来是不是只有一百五了?那是不是没有保证原子性?所以说这个地方呢,这个所谓的原子性指的是这个东西。那在这个基础之上,Red还支持了不同的一些排序方式啊,那有序排序,无序排序等等等等各种排序方式,那为了保证我们release这种数据库结构进行数据存和数据取的一个效率,我们的数据是保存在缓存,也就说内存中的。
07:00
那只不过呢,会周期性的把我们内存里的数据会写入到磁盘上,或写入到指定的文件里边,以实现我们RA数据的一个什么永久保存啊,永久保存,并且为了防止万一数据库这个对应的这个保存的数据在内存里消失了,比如说断电了,那我们仍然可以找回我们所有的数据。啊,没人可以找我们的数据,那这个就是对应的的一个实现的过程,那同时呢,既然作为一个现在比较流行的这种数据库,那release也支持主从,那主要作用还是为了release互相之间的一个备份,做了主从了,那万一主release出现了问题,那我们的从release就会有对应的一个数据,保障我们的数据的一个完整性,OK。那这就是我们的一个工作原理,那接下来我们来说一下关于RA持久化的一个操作啊,是怎么来实现的。
08:01
那呢,这句话有两种,第一种呢,叫做RDB啊叫做RDB,那对应的所谓的RDB呢,是当我们的数据在内存中保存的时候,还会将内存中保存的数据快照到磁盘一份,注意是快照到磁盘一份。那当需要重启时,那内存是不是就清空了?但是这个时候由于我们已经把快照保存到磁盘里了,那当重启之后,我们的RDB就会调用这个什么快照给它加载到内存里,那我们的数据就还原回来了。所以说RDB的这种。呃,数据保存模式非常简单啊,非常简单。OK,那它有两个动作,一个叫r DB save,一个叫r DB load,分别是保存和读取,啊,分别是保存和读取,OK,那这是我们RD,这是我们RA的第一种处理化方式,叫做RDB,那做RDB。好了,我们再看第二种。第二种呢,叫做a of,那叫做a of。呃,它的全称叫append only。
09:03
嗯,Off啊,Openend only off啊,然后呢,这个对应的a of的这种存储方式呢,它是将我们对应的数据库的这种写入命令记录到of文件里边,那大家会发现这个东西和我们MYSQ当中有一个东西非常非常相似,那就是blo日志文件,那其实我们就可以把A这种记录方式理解为就是。Release的bin log日志文件,然后以此呢来记录对数据库的修改操作,并且把修改操作命令记录到L当中,以此达到记录数据库修改和数据的状态。Of的保存方式呢是这样的,首先呢,将客户端请求的命令转化为网络协议格式,其次呢,将协议内容字段追加到一个叫server.of of.B的文件当中。然后呢,当AF系统达到设定条件时,会自动的调用一个叫a of s c啊,FSYC的一个什么函数工具啊,来进行把对应的文件保存到文件里的或保存到一个磁盘里的这样一个操作,那我们来看一下它的触发条件是什么?
10:20
他触发条件是吗。那首先呢,就是A保存了数据之后的一个数据协议格式,那A呢,以这种网络协议格式保存了数据之后呢,Of会将这种数据格式转换为命令模拟客户端重新执行一遍,那就达到了数据恢复的一个过程。啊,达到了数据恢复的一个过程,那这就我们数据恢复的方式,那再一个就是创建模拟的客户端,读取AF保存的文本,还原数据为原命令和原参数,这样呢,还原了原命令和原参数之后,再进行执行一遍,就相当于完成了数据的恢复,那我们继续执行第二步,直到完成所有的a of文件的读取和恢复之后,我们的数据就恢复回来了。
11:06
再一个就是关于A的重写过程啊,A的重写过程。那关于AF的重写过程呢?的是它会把我们AF文件进行覆盖,呃,覆盖,那AF的重写一般指的是我们对数据进行修改时才会这样操作,那避免什么呢?避免出现重复记录同一个对数据修改的操作,比如说一开始我们对这个某一个数据字段进行了一个疑似修改。第二次,我们又对这个数据进行又一次的修改,那我们需要记录到一个of,再记录另外一个of,再去另外一个of吗?而不需要,我们可以把对同一个数据的修改。覆盖式的写入到一个A文件中,只保留对某数据的最新一次的修改记录就可以了。看,这就是所谓的重写过程。OK,那关于的这种。嗯。持久化的方式,第一个就是RDB,第二个就是NF,这是我们生产环境中常见的两种保存方式,那到此我们就把的这个搞定了。
12:07
那还是说red呢,它是作为一个这种呃,缓存数据,或者说快速保存数据的这种数据库在这保使用,但是呢,它的数据结构由于和MYSQL不太一样,这就导致呢,我们的和MYQ啊。暂时不是进行一个互相替代的一个替代的这么一个一个身份,而是他们是一个做互补的一个身份,那这个时候呢,我们就有一种模式来提高MYSQ的一种性能,也就说利用这种使用内存保存数据的方式来提高MYSQL的这种。数据保存和读取性能,那怎么来提升呢?很简单啊,看一下这个图。啊,看下这个图。那这个图呢,其实是呃,我们根据呃上一个文档讲啊密的时候我改了一个图,那我只是增加了一个red数据库,那这个数据结构是这样的啊,首先我们的外部服务器在解析我们相应的代码的时候,这个代码里边有一个if语句,这个if语句的这个执行啊,是优先去release数据库里边查询有没有相应符合条件的数据。
13:11
OK,那这个时候里边默认。不一定有,怎么办呢?如果red没有,则再会向我们的阿米巴发些请求,因为阿米巴是所有这种关系型数据库的啊,这种代理服务器嘛,啊,或者代言人嘛,那就找他了,那这个时候这条查询过来之后,我们的啊密码就会向我们的。啊,这种关系型数据库发起查询操作,那关系型数据库里边是一定会有我们所要查询的内容的结果的,那当我们从关系型数据库里边找到了对应的数据结果之后,首先阿米巴会把这个数据返回给用户。解析到页面上,其次我们会把对应的这个查询出来的数据插入到服务器上一份,啊,注意是插入到服务器上一份,只不过我们在进行对这个服务器的数据插入的时候呢,我们会对这个服务器的插入的数据设置一个TTL值,也就是说有效时间值。
14:11
那为什么要设置TTL值呢?很简单。你想想,Red是为了来做MYSQL数据的缓存的,那缓存的内容是不是要一直保证和原始数据的一致性啊?那如果突然之间我们原始的关系型数据库里的数据更新了,而你缓存没有更新的话,那这就会导致用户优先来查缓存,而查不到真正的有效的结果。所以说我们要设置缓存数据的时间,哎。比如说我们从关系型数据库里面查询出来的数据,保存到缓存服务器当中,保存十秒中。十秒钟之内,如果有用户来查询,那查询条件是一样的话,就从这里边儿取出去。那十秒钟过了,OK,这个缓存数据数据自动消失,然后呢,当有用户在查询时,还要再去查询我们关系数据库,然后查询结果再插入到里边,再保存十秒。
15:11
也就是说,我们以此来保证我们red里边的数据一直和我们关系型数据库里边的数据保持是一致的,而不至于由于没有设置有效时间,导致red里边缓存的这种数据是旧的数据,是无效的数据啊,是无效的数据。这就是所。用来帮助MYSQL这类数据库优化的一种优化策略和优化方案,那这就是RA和MYS的一种关系啊,一种关系结构,OK,那我们呢,就把这个对应的关系结构图讲完了,那接下来呢,我给大家看几个对应的一个。MYSQL相关的一个图。那前面这几个图呢,我就不一一给大家讲了,这是我们当时讲原理的时候讲的一些信息啊,这个呢,我就不一一给大家讲了,那我们从这几个图开始来讲。
16:06
首先呢,这个图我们已经看到过了,那就是MYSQL的主从的一个关系图。主开启B浪日志,从服务器下载B日志文件进行更新就可以了,那这个时候呢,它的主要作用是用来均摊我们的这种,呃。不是均摊,是用来备份我们主服务器的数据的,但是有些时候呢,我们可以搭建一种特殊的关系,叫做主主服务器。主主服务器就是互为主从啊,我这个是它的主服务器,那这个是他的主服务器,那就意味着我们的写操作往两个上写都可以写,这个主服务器会同步到这个从服务器上写,这个主服务器会同步到这个服务器上,这就是主主,那主主的功能是分摊写压力。嗯,分摊写压力。这没这个图,那么再来看一下这个图。嗯。主主呢还有另外一种备份方式,比如说我们这个地方手头有三台服务器啊,三台服务器我们有两个主服务器,并且两个主服务器呢,保存的数据内容还不一样,第一个主服务器呢,可能保存的是我们的这个用户相关的数据,那第二个主服务器呢,可能保存的是我们的一个什么产品相关的信息,OK,那由于是两个不同的模块不同数据,那我们要对两个不同的模块的数据都要备份那。
17:24
正常来说,其实我们应该是什么。这个主服器有一个单独的从服务器,这个主服务器有它的单独存服务器,但是假如说啊,有些时候我们有一台配置特别高的服务器,或者说只有一台服务器了,我们需要把两个不同的服务器上数据备份到同一个设备上,应该怎么备份呢?原理很简单啊。我们只需要在同一个设备上启用两个不同的SQL程序就可以了,其中有一个MYSQL进程是3306端口,另外一个MYSQL程序是3307端口,那这个零一的备份到3306上,这个零二的备份到3307上,就没有互相影响了,那这就是我们生产环境中一种啊。
18:04
叫做主主从的模式啊,主主从的模式OK。好了,我们再看第三个图啊,第三个图,第三个图呢,是关于阿米巴的一种模式了啊,那就是阿米巴啊,设置好之后呢,由阿米巴去代替主从来接受用户的请求,做来做一个代理,来做一个反向代理,当有用户请求时,再把用户的请求反。像代理给我们的后边的主从服务器,OK,那再一个就是关于啊咪巴的一个配置了,那这个图里边呢,其实就是啊咪巴,然后外加下边有主从从这么一个主从结构,然后这样的一个过程,那这个时候呢,我是在这个里边写了关于啊米把配置文件的一些关键的标签,那注意这个标签呢,分为这么一部分。是这么一部分,这两部分是互相隔离开的,上边呢是阿米巴的一个配置信息,下边呢是阿米把所。连接的关于下边这些资源池的信息,OK。
19:04
所以说一定要有所区别和区分。那再一个就是这个呢,就关于的处理方式了,比如说。Red在进行数据存储的时候,它是以剑值队的方式来进行存储,比如说我们这个地方有一个剑名叫做荣耀,在这个不是建名啊。只是一个一个库吧,啊一个库吧,在这里边我们荣耀保存荣耀相关的所有的这种产品信息都可以保存这个库里边儿啊,保存这个库里边儿。那智能手机相关的可以保存这个库里边,那如果有人来通过检索的时候,我们可以通过什么交集的方式来进行获取对应的准确资源,比如说有人想查询智能手机,而且是华为荣耀的,而且是价格在3000到三千五的,那我们可以就拿这三个。来做什么交集,那三个做完交集之后,共有的那部分记录就是我们用户所查询的。所以你会发现这种。数据存储模式可以大大提升我们对数据的一个检索过程,OK,好了,这是RA的一个简单的一个工作的一个图形。
20:08
它再一个就是关于red release和MYSQL工作的一个模型,就是刚才我们那个用red优化MYSQL的方式了,那注意这个地方呢,是一个PP的页面,它里边既有red release函数,又有MYS函数,那优先if语句优先通过release函数找release,看看red release里边有没有对应的一个数据,如果有则直接返回,那就没有MY。所以说这个时候就大大降低了对MYQL的连接,那如果release里边没有对应的数据,则返回头来则要用MYSQL函数连接啊,MYSQL数据库,然后查询,查完之后呢,会把查询到的结果写入到一份。已被下次查询,只不过写入到re里边,这份数据呢,是有一定时间限制的啊,有一定时间限制的OK,那下边这两个图都是这样的一个结构,只不过是我换了一个这样的一个图形而已啊,只不过换了一个这样一个图形而已。
21:02
还是这样的,这是一个流程那。那对应的呢,我们的这个呃,数据库相关的面试题也就讲到这儿了,那也就结束了,那呃,至此呢,我们所有的这个面试题呢,就都已经讲解完毕了啊,都已经讲解完毕了,那希望呢,我们links的这个呃。从我们的这个网络基础到我们的这个数据库阶段的这个面试题呢,能够帮助到大家在今后面试的时候啊,能够有一个这样的一个呃提醒,或者说能有一个这样的一个帮助,那呃,除此之外呢,我们的面试题毕竟还是只是指导了某一部分知识点和某一部分故障或优化类的一些题目。如果说大家有对应的一个需求,比如说我某个这个实验配置忘记了,我某一个具体的参数忘记怎么操作了,那大家可以去我们的这个,呃,公众号上关注我们的公众号,然后呢,这个。
22:02
嗯,来这个发送关键词,然后这个。通过对应的关键词获取到我们对应的视频资源,啊,对应的视频资源,那对应的我们的视频资源呢,在这个,呃。百度网盘里大家去下载一下就可以看到我们所有的视频和所有的文档了,那其中呢,会包含我这个比较完整的这种课件,以及包括所有的PPT啊,大家也发现了啊,我比较这个擅长画各种各样的一个图示,那大家个人学习的时候呢,我也建议学习过程中呢,也多去通过一些图形来辅助自己理解啊,有一句话这样说的嘛。啊叫字不如表啊,用文字描述不如用表格描述,表不如图,你画表格不如用图形来表述,所以说呃,大家呢,多用这种象形的东西去来总结和归纳自己的这种呃学习的这种内容,OK,那希望呢,我们的这些呃面试视频对大家有所帮助,那OK,那我们的这个呃面试题呢,就讲解到此结束了,那希望所有看到我们视频的人都能。
23:09
这个在面试的时候超常发挥,然后呢,都祝大家找到一份比较好的工作,OK,那我们以后再见啊。
我来说两句