前言
好哥哥们,正如题目一样,安酱被虐了,虐的遍体鳞伤,归纳起来就是一个菜(真的菜)。
事件的通过真是一把辛酸泪啊。讲道理,再去之前我还是很有信念的(自信爆棚好吗)。随着面试的推动,我发现我扛不住了,数据库底层原理和网络相干我是真不会呀,不会就算了,面试官就挑着这些来问,都不按简历上的技术点来的。
面试公司的话据说由微博(不晓得是不是,反正就是某大厂)一个技术大佬带的一个团队组建的守业公司(当然还是在广州这边,有好哥哥想要挑战一下吗,评论区通知我)。进去还做了一份面试题,讲道理,题目间接对标字节好吗。好家伙一看一道硬币概率题、两道算法(记得有一个是原地算法)、还有一个 Mysql
的MVCC
实现原理(如同还有一个是 synchronized
和volatile
的原理)。就这 45 分钟做完。
认为这就完了吗?更虐我的还是面试官,我轻易说一个技术点根本都要打断我。就像本篇上面 Http 与 Netty 数据传输的区别
这个题目,就是从 Feign
和Dubbo
的区别引出来的。怎么说呢,就是死抠一个点,抠细节,这种模式是真的很难抗的住啊!!!
题目的话记录了一些没有答复的比拟好的,安酱也说不上难与不难(图片都是搬的我丙哥的,最初面有链接)。
Mysql 索引底层数据结构是什么
Mysql
索引采纳的数据结构是 B+
树(如下图),与 B 树
的次要区别在于B+
树辨别了叶子节点和非叶子节点。只有叶子节点才会存储数据,非叶子节点只存储键值。
叶子节点之间应用双向指针连贯,最底层的叶子节点造成了一个双向有序链表。
Mysql 索引数据结构为什么抉择 B+ 树,而不抉择红黑树或者其余树
这个的话讲一下应用B+
树的有点就能够了,而后我又答复了个寂寞(问我过后那一刻有点懵,其实我是晓得的,然而我就不通知他)。
B+
树是多路均衡二叉树,相较于红黑树、二叉树来说,整个树形构造高度会大幅缩小,这也意味着应用索引查找的次数会缩小,从而进步查问效率。B+
数辨别了叶子节点和非叶子节点,只有在叶子节点才会真正的存储数据。因为Mysql
的InnoDB
存储引擎一次IO
会读取的一页(默认一页 16K)的数据量。B 树
中叶子节点和非叶子节点都会存储实在数据,也就是说随着列数的增多,所占空间会变大, 树相应就会变高,磁盘 IO 次数就会变大。- 应用
B+
能更好的反对范畴查找。这里次要说的是性能上,B 树
也能够反对范畴查找,然而须要在树往下或者往上查找。B+
在叶子节点就曾经保护了一个双向有序链表,所以人造就适宜用来做范畴查找。
Mysql 索引文件是怎么加载到内存中的
这里在面试的时候我是没有了解面试官的意思的,当进去坐公交复盘的时候忽然就想起来了。面试官应该想晓得的是应用索引查找的过程,这个过程蕴含了加载页索引文件(是我太菜了)。
这里须要重点讲突出的是索引文件是按页加载的,比如说我要做一个惟一 id
等值查找,其大略过程如下:
如果咱们查问值等于 9 的数据。查问门路 磁盘块 1
->磁盘块 2
->磁盘块 6
。
第一次磁盘 IO:将 磁盘块 1
加载到内存中,在内存中从头遍历比拟,9 < 15
,走左路,到磁盘寻址 磁盘块 2
。
第二次磁盘 IO:将 磁盘块 2
加载到内存中,在内存中从头遍历比拟,7 < 9 < 12
,到磁盘中寻址定位到 磁盘块 6
。
第三次磁盘 IO:将 磁盘块 6
加载到内存中,在内存中从头遍历比拟,在第三个索引中找到 9,取出 Data
,如果Data
存储的行记录,取出 Data
,查问完结。如果存储的是磁盘地址,还须要依据磁盘地址到磁盘中取出数据,查问终止。(这里须要辨别的是在InnoDB
中Data
存储的为行数据,而 MyIsam
中存储的是磁盘地址。)
TCP 怎么确保传输可靠性
面试官问我这个的时候,我的答案是 我不会
(是真的,我是真的不会)!!!
这篇的话就大略讲一下保障可靠性几点,不做深刻的剖析。我也不会呀,是时候要好好钻研一下网络相干的货色了。
TCP
在建设连贯采纳三次握手和断开连接四次挥手的连贯管理机制(过后我只答复了这一个,而后面试官来了一句就因为这个就能确保传输的安全可靠吗。我是真想答复是的)。- 测验和。
TCP
测验和的计算与UDP
一样,在计算时要加上12byte
的伪首部,测验范畴包含TCP
首部及数据局部,然而UDP
的测验和字段为可选的,而TCP
中是必须有的。计算方法为:在发送方将整个报文段分为多个16 位
的段,而后将所有段进行反码相加,将后果寄存在测验和字段中,接管方用雷同的办法进行计算,如最终后果为测验字段所有位是全 1 则正确(UDP 中为 0 是正确),否则存在谬误。 - 序列号。
TCP
将每个字节的数据都进行了编号,这就是序列号。作用如下:
- 3.1 保障可靠性(当接管到的数据总少了某个序号的数据时,能马上晓得)。
- 3.2 保证数据的按序达到。
- 3.1 提高效率,可实现屡次发送,一次确认。
- 3.1 去除反复数据。
- 确认应答机制(
ACK
)。TCP
通过确认应答机制实现牢靠的数据传输。在TCP
的首部中有一个标记位——ACK
,此标记位示意确认号是否无效。接管方对于按序达到的数据会进行确认,当标记位ACK=1
时确认首部的确认字段无效。进行确认时,确认字段值示意这个值之前的数据都曾经按序达到了。而发送方如果收到了已发送的数据的确认报文,则持续传输下一部分数据;而如果期待了肯定工夫还没有收到确认报文就会启动重传机制。 - 超时重传机制。当报文收回后在肯定的工夫内未收到接管方的确认,发送方就会进行重传(通常是在收回报文段后设定一个闹钟,到点了还没有收到应答则进行重传)。
- 流量管制。接收端解决数据的速度是无限的,如果发送方发送数据的速度过快,导致接收端的缓冲区满,而发送方持续发送,就会造成丢包,继而引起丢包重传等一系列连锁反应。
- 拥塞管制。流量管制解决了两台主机之间因传送速率而可能引起的丢包问题,在一方面保障了 TCP 数据传送的可靠性。然而如果网络十分拥挤,此时再发送数据就会减轻网络累赘,那么发送的数据段很可能超过了最大生存工夫也没有达到接管方,就会产生丢包问题。为此
TCP
引入启动机制,先收回大量数据,就像探路一样,先摸清以后的网络拥挤状态后,再决定依照多大的速度传送数据。此处引入一个拥塞窗口。
Http 与 Netty 数据传输的区别
实际上这道题是问 RPC
带进去的。过后问了一个 Dubbo
和 Feign
有什么的区别?这时安酱就往陷阱外面跳了,因为 Dubbo
应用的是 Netty
传输,而后通过反射调用本地办法,而Feign
是通过RestTemplate
调用 Http
接口的形式。而后就正中面试官下怀,从而引出了这个一个问题,我又答复了个寂寞。
这里的话次要是针对于 Http
和Scoket
,Netty
自身也是反对 Http
的。
HTTP
是一个属于应用层的面向对象的协定
;而Scoket
是应用程序与TCP/IP
协定交互提供套接字 (Socket
) 的接口。HTTP
属于短连贯(尽管反对长连贯,然而连接时间是由服务器决定的);Scoket
属于长连贯,通常状况下Socket
连贯就是TCP
连贯,因而Socket
连贯一旦建设, 通信单方开始互发数据内容,直到单方断开连接。HTTP
是基于申请 / 响应模式,一次申请过程中,Server
端和client
端的角色是不能调换的;Scoket
属于全双工通信,Server
端和client
端是能够互相通信的。
比拟形象的比喻:Http
是轿车,提供了封装或者显示数据的具体模式; Socket
是发动机,提供了网络通信的能力。
参考:
一口气搞懂 MySQL 索引所有知识点
TCP 如何保障可靠性