2021实习面试常见知识点梳理
文章目录
实际上在实习生阶段已经整理了很多被问到的问题以及部分问题写了一下自己的解答(还有很大一部分坑没填呢),秋招阶段感觉其实万变不离其宗,问来问去都是那么几个问题,所以就没做记录了。在此依据记忆在几个主要的方向写出几个最常见的问题吧。
计算机网络
简述从输入网址到浏览器显示的过程
当我们将网址输入到浏览器后,第一件事就是解析URL得到域名,通过DNS协议得到改域名IP地址,接着通过IP地址与服务器通过TCP三次握手建立链接,然后构建HTTP请求,将HTTP的传输工作交给操作系统的协议栈;发送请求成功后,浏览器会从服务器那里得到HTML文件和资源文件,接着进行页面渲染,最后就是我们看到的模样。
这个过程中重要的几个知识点是DNS解析、HTTP请求、TCP/IP协议栈、页面渲染等,只用挑一两个着重介绍,其它略过。当然也可以继续扩展,HTTP和HTTPS的区别和联系,还可以说到对称加密和非对称加密,还可以说网络安全等,主要目的是让整个面试过程跟着你的技术栈走,而不是被面试官带到你不会的地方。
DNS解析:
浏览器拿到URL后,首先会对URL进行解析,将域名与实际文件路径分离,然后通过DNS协议得到该域名的IP地址。
首先浏览器会查询浏览器缓存,看有没有这个域名的IP地址,如果没有才会进一步访问本机缓存,若本机缓存也没有的话才会发起DNS请求。
DNS的服务器是一个树状结构,对于域名来说是倒着解析的,根节点是根DNS服务器,他的子节点是.com、.cn这种顶级域名服务器,然后进一步向下解析。
以baidu.com为例,电脑会先对根DNS服务器发起请求,根服务器IP地址一般每个电脑上都有,我们一般设置为8.8.8.8或114.114.114.114,电脑在访问根域名服务器后会得到.com域服务器的IP地址,然后访问.com域服务器得到baidu.com的IP地址。
HTTP请求
在解析URL时,我们可以得到域名、网站资源路径、端口号和参数,通过DNS请求得到域名IP地址后,浏览器就可以构建并发送HTTP或HTTPS请求,HTTPS就是在HTTP协议上加了一个TLS协议进行数据加密;
HTTP请求有很多种,但对资源的操作离不开增删查改,也就对应着POST、DELETE、GET、PUT。最常用的是GET和POST,其区别是GET请求的参数在URL中,而POST请求的参数在body中。很少用DELETE和PUT,这几个请求只是语义上不同,是为了让你的应用程序能够清晰的进行通讯,对HTTP本身来讲没什么区别,都能完成相同的功能。
以GET为例,当浏览器发送HTTP请求时,同样也不是直接发送了,先去查看浏览器缓存,分为强缓存和协商缓存,浏览器发起HTTP请求会首先根据HTTP头信息判断是否有强缓存,若强缓存命中且未过期,就不会向服务器发送请求了;如果强缓存没命中,浏览器就会发送HTTP请求,这个请求的header头会带有浏览器最后一次请求该资源的时间和资源校验码(使用资源修改时间、资源大小等信息生成),服务器收到请求后会判断协商缓存是否过期,如果过期就会返回新的资源,未过期就会返回304状态码,表示该资源位更新,可以继续使用。
TCP->网络连接层
HTTP发出请求后会将数据包交给下层协议栈处理,在传输层和运输层会被分别加上TCP头和IP头,并且被发送出去,沿路的网关会收到这个数据包并进行识别和转发,直到该数据包被服务器收到,并按相同的流程返回数据包。
HTTPS
由于HTTP是明文传播,会有窃听篡改冒充的可能,所以HTTPS在HTTP基础上加了SSL层,通过加密的方式保证数据安全。
SSL通过加密防止窃听,通过签名防止篡改,通过证书防止冒充。
HTTPS协议在客户端和服务器进行通信之前,会进行密钥协商,通过一轮非对称加密,一般是RSA加密传递后续通讯用的对称加密密钥,由于非对称加密太慢,所以后续通讯用对称加密。在密钥协商过程中,服务器会将证书发给客户端,客户端到CA机构验证证书的摘要的合法性,从而防止中间人攻击。
中间人攻击:SSL劫持攻击、SSL剥离攻击、针对SSL算法的攻击;
SSL 劫持攻击即 SSL 证书欺骗攻击,攻击者为了获得HTTPS传输的明文数据,需要先将自己接入到客户端和目标网站之间;在传输过程中伪造服务器的证书,将服务器的公钥替换成自己的公钥,这样中间人就可以解密客户端和服务端的数据传输内容。可以通过在网站前端加入证书校验来预防 SSL 劫持攻击。
SSL 剥离攻击,即将 HTTPS 连接降级到 HTTP 连接。假如客户端直接访问 HTTPS 的 URL,攻击者是没办法直接进行降级的,该攻击方式主要是利用用户并不会每次都直接在浏览器上输入 https 来访问网站或者有些网站并非全网 HTTPS,中间人攻击者在劫持了客户端与服务端的 HTTP 会话后,将 HTTP 页面里面所有的 https:// 超链接都换成 http:// ,用户在点击相应的链接时,是使用 HTTP 协议来进行访问。可以通过在网站前端检查 URL 是否被篡改来预防 SSL 剥离攻击。
针对 SSL 算法的攻击:低版本的 SSL 协议是存在漏洞的,这些漏洞可能会被公共者利用,及时升级服务端的 SSL 配置可以预防针对 SSL 算法的攻击。
TCP三次握手
最开始客户端和服务器都是closed状态,主动打开的是客户端。
1.TCP服务器先创建传输控制块TCP,时刻准备接受客户端的连接请求,此时服务器进入listen状态。
2.TCP客户进程也是先创建传输控制块TCP,然后向服务器发送请求报文,报文首部中同步位SYN=1, 同时选择一个初始序列seq = x,此时客户端进入SYN-SENT(同步已发送)状态。TCP规定,SYN=1,的报文段不能携带数据,但要消耗一个序列号。
3.TCP服务器收到请求报文后,如果同意连接,则发送确认报文。确认报文首部中确认序列号标志ACK=1,同步位SYN=1,确认号ack=x+1,同时自己也选择一个初始序列seq=y,此时服务器进入SYN-RCVD状态(同步收到)。
4.TCP客户进程收到确认报文后,还要向服务器发出确认报文。确认报文首部中确认序号标志位ACK=1,确认号ack=y+1,自己序列号seq=x+1;此时,TCP建立连接,客户端进入ESTABLISHED状态。TCP规定ACK报文段可以携带数据,如果不携带数据则不消耗序号。
5.服务器收到报文后,服务器进入ESTABLISHED状态。此后双方就可以通信了。
为什么要三次握手,而不是二次或四次呢
三次握手防止失效的连接请求被服务器接受。假设为两次握手,客户端发送一个连接请求,由于网络原因,迟迟未到服务器,客户端没收到确认报文,认为服务器没收到,就又发送了一个连接请求,与服务器建立连接,传输完成后,与服务器断开连接。假设之前滞留的那个请求报文又到了服务器,就会让服务器与客户端再次建立连接,这是服务器就一直等待客户端发送数据,造成了资源的浪费。如果是三次握手,就算之前滞留的请求报文到了服务器,服务器接受了那个失效的报文并向客户端发送的确认报文,而客户端不会再次发送确认报文,由于服务器收不到确认报文,也就不会再次建立连接了。
两次握手智能保证单向链路可以通信,理论上,双向链路通信需要四次,但服务器收到确认报文和发送同步报文可以合为一次握手,让服务器SYN和ACK数据包合在一起,所以实际上只需要三次握手即可。
TCP四次挥手
- 第一次分手,客户端设置释放连接报文首部FIN=1,序列号seq=u(即为前面已经传送过来的数据的最后一个字节加1),向服务器发送释放连接报文,此时客户端进入FIN-WAIT-1状态,表示客户端已经没有数据要发送给服务器了。
- 第二次分手,服务器收到客户端的释放连接报文,发送确认报文,ACK=1,ack=u+1,并置序列号为v,此时服务器进入CLOSE-WAIT状态,TCP服务器告诉高层应用进程,客户端向服务器的连接释放了,服务器向客户端发送数据,客户端仍然接受。客户端收到确认报文后进入FIN-WAIT-2状态。
- 第三次分手,服务器最后的数据发送完后,就向客户端发送释放报文,FIN=1,ACK=1,ack=u+1,seq=w,此时服务器进入LAST-ACK状态。
- 第四次分手,客户端收到释放报文后,必须发出确认,确认标志ACK=1,确认序号ack=w+1,序列号seq=u+1,此时客户端进入TIME-WAIT状态,必须等待2MSL(最长报文寿命)后才释放连接,若等待过程中没有收到服务器的回复,说明服务器已正常关闭,此时客户端才释放连接,服务器收到释放报文后立即释放连接,可见服务器结束TCP连接比客户端早一点。
为什么要等2MSL(最大生存时间)
原因主要有二个:
- 确保客户端的发送的最后一个ACK报文能到达服务器,保证TCP协议全双工连接能够可靠关闭。
- 防止存在失效请求,保证这次连接所有报文数据在网络中消失。
TCP通过哪些方式来保证数据的可靠性?
TCP保证数据可靠性的方式大致可以分为3类
- 在数据包层面:校检和
- 在数据包传输层面:序列号,确认应答,超时重传
- 在流量控制方面:拥塞控制(滑动窗口协议)
校检和
计算方式: 将发送方的数据段都当作一个16位的整数,将这些整数加起来,并且进位不能丢弃,补加在后面,最后取反,得到校检和。
发送方计算后填充,接收方得到数据后以相同的方式计算求出校检和,并与发送方进行比对,如不同数据传输肯定有误,相同,数据传输也不一定成功。
序列号,确认应答,超时重传
在数据包传输过程中,每个数据包都会有一个序号,当数据到达接收方后,接收方会发出一个确认应答,表示收到该数据包,并且会说明下一次需要接收的数据包序列号(32位确认序列号)。如果发送方在一段时间内(2RTT)没有收到确认应答,则说明数据包丢失或者确认应答包丢失,此时发送方重新进行数据包重传。
但发送方并不是一定要等到上一个数据包的确认应答再发送下一个数据包,TCP会利用滑动窗口协议来提高传送速度,在一个发送窗口大小内,不用一定要等到确认应答才能发送下一段数据,发送窗口的大小就是无需确认等待而可以继续发送的数据段数量的最大值,而发送窗口大小取决于接受端的接收窗口的剩余大小和拥塞窗口来决定的。(TCP会话的双方都各自维护一个发送窗口和一个接收窗口)
拥塞控制
发送方维持一个叫做拥塞窗口cwd(congestion window)的状态变量。拥塞窗口的大小却决于网络的拥塞程度,并且动态变化。发送方的发送窗口大小等于拥塞窗口和接收窗口的较小值。
发送方主动控制成为你的,有慢启动(从cwnd初始为1开始启动,指数启动),拥塞避免(到达ssthresh后,为了避免拥塞,线性增长),快重传(接收方每收到一个报文段都要回复一个当前最大连续位置的确认,发送方只要一连收到三个重复确认接收方丢包,快速重传丢包的报文,并TCP马上拥塞窗口cwnd减小到1),快恢复(直接从ssthresh线性增长)
TCP长连接和短链接有什么区别?
TCP短链接是指客户端与服务器端连接后只进行一次读写就关闭连接,一般是客户端关闭。
而长连接是完成一次读写后不关闭连接,直到服务端压力过大则选择关闭一些长时间进行读写的连接。
TCP短链接的优点在于管理简单,而且不会对服务器造成太大压力,缺点是每次读写都要连接耗时较长。
TCP长连接的优点是可以迅速进行多次读写,缺点是对服务器端压力过大,而且容易被恶意连接影响服务。
长连接和短链接的区别就在于客户端和服务端选择的关闭策略不同,具体需要根据应用场景来选择合适的策略。
TCP粘包、拆包及解决办法?
TCP之所以会产生粘包和拆包问题,是因为它本身就是一种字节流协议,TCP本身就没有数据包的概念,需要发送和接收的数据包是没有格式的,以字节流的形式传输,而在传输过程中会被分割为一段段数据块,也就是报文。TCP要发送的数据会被先放置在缓冲区,接收数据也是从缓冲区读取,而缓冲区的大小就是最大报文长度,如果需要发送的数据长度大于缓冲区剩余大小长度或大于最大报文长度,就会出现拆包现象;如果需要发送的数据很少,而短时间内又有其他数据包需要发送,就会出现粘包现象。
解决
网络协议栈详解:https://www.cnblogs.com/mrlayfolk/p/11965347.html
操作系统
内存管理
简述进程线程切换的流程
如果想要从A进程切换到B进程,必定要先从用户态切换到内核态,因为这个切换工作是由操作系统完成的,操作系统需要先挂起正在占用CPU的A进程,才能切换到B进程。
由于从用户态切换到内核态的时候,CPU是在用户进程手中,所以这个是通过硬中断来实现的。再从用户态切换到内核态之前需要首先保存用户进程的上下文,以便下一次执行是可以继续之前的工作。
这个上下文就是进程的执行环境,包括所有的寄存器变量,进程打开的文件、内存信息等。一个进程的上下文可以分为用户级上下文、寄存器上下文、系统级上下文。用户级上下文存储的是用户进程的内存数据和堆栈数据等;寄存器上下文是一些通用寄存器;系统级上下文是内核栈、PCB(进程控制块)等;
进程在地址空间会划分为哪些区域
我来简单讲一下把文件加载到内存中的一个过程,以Windows为例,PE文件中有一个叫节的概念,节是PE文件中存放代码和数据的基本单元,用以存储不同类型的数据,比如data节、code节等,一个节的所有原始数据必须加载到连续的内存地址空间,这也就造成了在虚拟地址空间中的区块划分。
在虚拟地址空间中会按节划分为代码段、数据段、未初始化的数据段以及堆栈这些区块。
堆和栈有什么区别
我们常说堆栈堆栈,其实堆和栈是两个不同的概念,最直观的理解,堆是由用户控制的,Java中可以用new关键字在堆中申请内存来实现内存分配,c语言是用malloc,而栈是由操作系统控制的,在栈中存储的是这个进程的局部变量等,比如我们用new关键字来申请一块内存,内存本身是在堆中开辟的,而指向内存的指针是存储在栈中的。
操作系统为什么分内核态和用户态,这两者如何切换
因为在CPU的指令中,有一些是非常危险的,比如清理内存、设置时钟等,如果所有的程序都能使用,就有可能造成程序崩溃,所以CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统使用。CPU的特权指令有四级,从Ring0到Ring3
,正常使用时一般只有两级,即用户态Ring3和内核态的Ring0,Ring3状态不能访问Ring0的地址空间,包括代码和数据。
用户态切换到内核态的三种方式
系统调用(软中断)
硬中断
异常
虚拟地址怎么映射到物理地址
虚拟地址的构成为页目录索引、页表索引和表内偏移
以win32系统为例,页目录和页表都为1024个,页表大小为212=4KB,一共是4GB(210210*4*210=4230=4GB,1GB=210MB=210KB=210B)的虚拟内存空间,而从虚拟地址空间到物理地址空间实际上就是通过页目录索引和页表索引找到内存页。
在页表项中有个标志位,用来标识包含此数据的页是否在物理内存中,如果在的话,就直接做地址映射,否则,抛出缺页中断,操作系统会把此数据页调入内存。
socket编程中怎么处理并发请求
对多线程的处理和单线程处理的不同之处在于各个不同的进程可能会访问相同的资源,如果是对相同资源进行修改的话,需要用到锁。
简述IO多路复用
Linux的IO访问通常是操作系统先将数据拷贝到操作系统的内核缓冲区,然后再从内核缓冲区拷贝到应用程序的地址空间,再这两个阶段中,有不同的IO方式,主要为阻塞IO,非阻塞IO,异步IO和IO多路复用。
阻塞IO即当数据还没准备好,也就是说数据还在操作系统的内存缓冲区时,用户进程就会一直阻塞,等待数据从内核缓冲区拷贝到应用进程的地址空间。
非阻塞IO就是如果数据还没准备好,操作系统就会给应用进程一个error,并不会阻塞应用程序,而一般应用程序会持续询问数据是否准备好,所以从另一个角度来说也是阻塞的。
异步IO才是真正的不阻塞,当用户进程发起read后,操作系统会立即进行回复,这样用户就可以做其他事情,当数据拷贝到应用程序的地址空间后,操作系统就会给用户进程一个信号,而用户进程就可以用回调函数对信号进行响应。
IO多路复用则是允许一个程序同时等待多个文件描述符,当一个文件描述符(文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,用于指代被打开的文件,对文件所有 I/O 操作相关的系统调用都需要通过文件描述符。)就绪,select函数就会返回,当然IO多路复用在本质上还属于阻塞IO,只不过可以同时进行多个IO操作。
Linux的IO复用机制中有select、poll、epoll三种,
select和poll的时间复杂度都是O(n),因为它们都是在对IO列表进行轮询,不同点在于select能监视的文件描述符有上限,一般为1024,当然这个时在Linux内核中进行的宏定义,是可以修改的,而poll时基于链表来存储的,所以没有这个上限。
而epoll是基于事件驱动的,所以不需要轮询,epoll会把事件和每一个IO流对应起来。而且epoll是通过一块共享内存来实现内核空间和用户空间的通信的,比起select和poll的大量数据拷贝来说效率更高。
不过select的优点在于兼容不同的操作系统,而poll、epoll只能用于Linux操作系统。
进程线程管理
简述进程间通信的各种方法
进程间通信的方式通常为管道、系统IPC、套接字三种,管道分为无名管道和命名管道**;系统IPC有消息队列**、信号、共享内存三种。
无名管道的本质是内核缓冲区的环形队列,每次读取数据后缓冲区都会移动,并且无名管道只能在有亲缘关系的进程间使用。
命名管道则以文件的形式存在,由于有一个路径名,没有亲缘关系的进程间也可以使用命名管道。
消息队列是存放在内核中消息链表,具有特定的格式,支持多种数据类型,且允许多个进程进行读写。
信号是软件层次对中断机制的一种模拟,是一种异步通信方式,并且信号可以在用户空间进程和内核之间直接交互。
共享内存就是两个进程对同一块内存进行读写,是最快的IPC形式,但不适合大量数据传输。
Socket是TCP/IP协议族的封装,不仅可以用于本机上进程的通信,更多的被用于网络通信中。
进程的互斥与同步
在操作系统中,进程是占有资源的最小单位,对于那种只能同时被一个进程持有的资源我们被称为临界资源,对于临界资源的访问,必须是互斥的。(临界资源的访问过程分为: 进入区、临界区、退出区、剩余区)
而进程之间访问临界资源时可以构成同步与互斥两种关系,同步即两个进程的资源访问必须时先后关系,比如经典的生产者消费者问题,读者写者问题。而互斥则是两种在进行资源抢占,比如购票问题。
通常在软件层面可以使用替换算法来实现,即每个进程持有一个标志,每次当使用资源时则将自己的标志位与资源的标志互换,如果在互换的过程中发现自己获得的标志是正在使用的状态,则在此循环等待。这种方法的缺点在于每个进程都需要进行循环等待,比较低效。所以一般是通过硬件层面的信号量即PV操作来实现进程间的临界资源管理。
死锁的解决方法
死锁的产生是在这样的一个环境中:比如我们有两个进程AB,他们都需要资源1和资源2,当进程A持有资源1,进程B持有资源2的时候,他们都需要对方手上的资源,而一般操作系统又不允许抢占,这个时候就发生了死锁。
从这个例子其实可以总结出死锁的4个必要条件:
1.一个资源只能被一个进程占有,不能共享
2. 一个进程请求资源失败时,它会等待而不是释放
3. 一个进程在释放资源前,其他进程不能抢夺资源
4. 循环等待
从死锁产生的原因可以设计一些方法去避免死锁的发生
5. 静态分配资源,一开始就把一个进程所需的全部资源都分配给他,但这样会降低资源的使用效率
6. 允许抢占,需要设置进程的不同优先级,高优先级的进程可以抢占低优先级的进程的资源。
7. 把资源进行编号,申请资源必须按照资源的编号顺序来申请。
如果死锁已经发生了,就需要去解开死锁,其本质思想就是分配资源打破循环等待
- 可以运行抢占,从一个或多个进程中抢出资源来给其他进程。
- 也可以终止一些进程,来达到释放资源的目的。
进程调度算法
先来先服务调度算法
对长作业有利,但对短作业不利
时间片轮转调度算法
每个进程都只能运行一个时间片
时间片的大小对系统性能的影响很大,时间片过大就和先来先服务算法一样,过短会导致进程切换开销过大
短作业优先调度算法
对长作业不利,不能保证紧迫性作业(进程)被及时处理
最短剩余时间优先算法
允许抢占,总是选择预期剩余时间最短的进程
高响应比优先调度算法
R=(w+s)/s,(R为响应比,w为等待处理时间,s为预计服务时间),选择R最大的进程执行
优先级调度算法
进程优先级分为静态优先级和动态优先级
多级反馈队列调度算法
分为多个队列,每个队列中按照时间片轮转算法进行进程调度,每个队列的时间片不一样(由低到高),如果进程在第一个队列的时间片内还没有完成,就会从第一队列删除进入第二队列,以此类推,只有当第一个队列为空时才会执行第二队列的进程
短作业有限且长作业不会太长时间不被处理
磁盘调度算法
先来先服务算法(FCFS)
根据进程访问磁盘的先后次序进行调度
优点是公平、简单
缺点是吞吐量低、寻道时间长
最短寻道时间优先算法
访问与当前磁头所在磁道最近的磁道
优点是可以得到比较好的吞吐量
缺点是对内外边缘磁道的请求可能会被无限延迟
扫描算法(SCAN)(电梯调度算法)
优先考虑磁头当前的移动方向,再考虑欲访问的磁道与当前磁道的距离,–>,<–,从小到大再从大到小
优点是避免了饥饿现象的出现
缺点是两侧磁道访问的频率仍低于中间磁道
循环扫描算法(CSCAN)
在SCAN算法的基础上,磁头只单向移动,当磁头移动到最外的被访问的磁道时,磁头立即返回到最里面欲访问的磁道。–>, -->,每次从小到大
优点是访问请求均匀分布
页面调度算法
先进先出调度算法(FIFO,First in First out)
最近最久未使用算法(LRU,Least Recently Used)
最近最少使用算法(LFU,Least Frequently Used)
时钟置换算法——为每一页设置访问位和修改位,将内存中所有页面通过连接指针接成循环队列,当页面被访问时访问位置置为1,被修改时修改位置置为1,每次淘汰时,从指针当前位置开始循环遍历,
- 第一次寻找访问位和修改位都为0的页面淘汰,
- 如果没有则寻找第一个访问位为0的页面将其淘汰,
- 如果都不存在则将扫描过的页面访问位为1的改为0,重复第1和第2步。
最佳置换算法-理想算法,找一个未来最长时间才会访问的页面进行淘汰。
数据库
简述关系型数据库和非关系型数据库
关系型数据库:指采用了关系模型来组织数据的数据库,
关系模型指的是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
优点是容易理解、使用方便、易于维护。
缺点是磁盘IO是一个很大的瓶颈,不适用于高并发的网站,海量数据查询效率低,难以横向扩展,当应用系统访问量与日俱增时,可能需要数据库系统进行扩展和升级,往往需要停机维护和数据迁移;导致性能欠佳的最主要原因时多表的关联查询、以及复杂数据分析类型的复杂SQL报表查询。为了保证数据库的ACID特性,必须尽量按照其要求的范式进行设计,关系型数据库中的表都是存储了一个格式化的数据结构。
非关系型数据库:指非关系型、分布式的,且一般不保证遵循的ACID原则的数据库存储系统。
非关系型数据库以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。
优点是:
- 用户可以根据需要去添加自己需要的字段,为了获取用户的不同信息,不像关系数据库中,要对多表进行关联查询。仅需要根据id取出相应的value就可以完成查询。
- 适用于SNS(Social Networking Sevice)中,例如Facebook,微博。系统升级,功能增加往往意味着数据结构的巨大变化,关系型数据库难以应付。
缺点: - 只适合存储较为简单的数据,对于要进行复杂查询到数据,关系型数据库更不适合。
- 不适合持久存储海量数据。
分类:
1.面向高性能并发读写的key-value数据库,类似于Map,代表:redis
2.面向海量数据访问的面向文档数据库,文档存储主要是JSON,代表:MogoDB。
3.面向搜索内容的搜索引擎,搜索引擎是专门用于搜索数据内容的NoSQL数据库管理系统,海量数据实时分析,代表Elasticsearch。
4.面向可扩展的分布式数据库,解决传统数据库存在可扩展性上的缺陷,主流代笔:HBase
关于NoSQL的CAP理论
NoSQL(非关系型数据库)的基本需求是支持分布式存储,严格一致性和可用性需要相互取舍(CP或AP)
CAP理论: 一个分布式系统不可能同时满足C(一致性)、A(可用性)、P(分区容错性)三个基本需求,并且最多满足其中的两项。对于一个分布式系统来说,分区容错性是基本需求,否则不能称之为分布式系统,因此需要再C和A之间寻求平衡。
C(Consistency)一致性
一致性指更新操作成功并返回客户端后,所有节点在同一时间的数据完全一致,与ACID中C完全不同
A(Availability)可用性
可用性指服务一直可用,而且是正常的响应时间。
P(Partition tolerance)分区容错性
分区容错性是指分布式系统在遇到节点故障或网络分区故障时,仍然能够对外提供满足一致性和可用性的服务。
关系型数据库和非关系型数据库的区别
1.成本:NoSQL数据库简单易部署,基本开源免费,关系型数据库如Oracle需要购买,成本高。
2.查询速度: NoSQL数据库存储在缓存中,而且不用经过SQL层层解析,查询速度快,关系型数据库存储在硬盘中,速度较慢
3.存储数据的格式:NoSQL数据库以Key-value形式、文档形式、图片形式等,所以可以存储基础类型以及对象或集合等各种形式,而关系型数据库只支持基础类型。
4.扩展性:关系型数据库有类似join的多表查询机制的限制导致扩展很难。NoSQL基于键值对,数据之间没有耦合性,所以易于水平扩展。
5.持久存储:NoSQL不适用持久存储,海量数据的持久化存储,还是需要关系型数据库。
6.数据一致性:NoSQL数据库一般强调的是数据最终一致性,不像关系型数据库一样强调数据一致性,从非关系型数据库中读到的数据可能还是处于一个中间态的数据,NoSQL不提供事务处理。
简述数据库的事务
数据库事务是一个数据库操作序列,这些操作要么全部执行,要么全不执行。
数据库事务有四个性质(ACID)
- 原子性(Atomicity):事务中的全部操作再数据库中是不可分割的,要么全部执行,要么全不执行。
- 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。
- 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务是透明的。
- 持久性(Durability):对于任意已经提交的事务,系统必须保证事务对数据库的改变不会丢失,即使数据库放生故障。
事务的ACID特性是由关系型数据库(DBMS)来实习的,DBMS采用日志来保证事务的原子性、一致性、持久性。日志记录了事务对数据库所做的更新,如果某个事物在执行过程中出现错误,就可以根据日志撤销事务对数据库的更新,使得数据库回滚到之前的初始状态。
事物的隔离性是由DBMS采用锁机制来实现的。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,直到前一个事务释放了锁,其他事务才有机会更新该数据。
更详细的连接:https://blog.csdn.net/keneyr/article/details/103937571