乐趣区

关于java:被某创业公司虐到体无完肤的N道题-|-高阶必备

前言

好哥哥们,正如题目一样,安酱被虐了,虐的遍体鳞伤,归纳起来就是一个菜(真的菜)。

事件的通过真是一把辛酸泪啊。讲道理,再去之前我还是很有信念的(自信爆棚好吗)。随着面试的推动,我发现我扛不住了,数据库底层原理和网络相干我是真不会呀,不会就算了,面试官就挑着这些来问,都不按简历上的技术点来的。

面试公司的话据说由微博(不晓得是不是,反正就是某大厂)一个技术大佬带的一个团队组建的守业公司(当然还是在广州这边,有好哥哥想要挑战一下吗,评论区通知我)。进去还做了一份面试题,讲道理,题目间接对标字节好吗。好家伙一看一道硬币概率题、两道算法(记得有一个是原地算法)、还有一个 MysqlMVCC实现原理(如同还有一个是 synchronizedvolatile的原理)。就这 45 分钟做完。

认为这就完了吗?更虐我的还是面试官,我轻易说一个技术点根本都要打断我。就像本篇上面 Http 与 Netty 数据传输的区别 这个题目,就是从 FeignDubbo 的区别引出来的。怎么说呢,就是死抠一个点,抠细节,这种模式是真的很难抗的住啊!!!

题目的话记录了一些没有答复的比拟好的,安酱也说不上难与不难(图片都是搬的我丙哥的,最初面有链接)。

Mysql 索引底层数据结构是什么

Mysql 索引采纳的数据结构是 B+ 树(如下图),与 B 树 的次要区别在于B+ 树辨别了叶子节点和非叶子节点。只有叶子节点才会存储数据,非叶子节点只存储键值。

叶子节点之间应用双向指针连贯,最底层的叶子节点造成了一个双向有序链表。

Mysql 索引数据结构为什么抉择 B+ 树,而不抉择红黑树或者其余树

这个的话讲一下应用B+ 树的有点就能够了,而后我又答复了个寂寞(问我过后那一刻有点懵,其实我是晓得的,然而我就不通知他)。

  1. B+ 树是多路均衡二叉树,相较于红黑树、二叉树来说,整个树形构造高度会大幅缩小,这也意味着应用索引查找的次数会缩小,从而进步查问效率。
  2. B+ 数辨别了叶子节点和非叶子节点,只有在叶子节点才会真正的存储数据。因为 MysqlInnoDB存储引擎一次 IO 会读取的一页(默认一页 16K)的数据量。 B 树 中叶子节点和非叶子节点都会存储实在数据,也就是说随着列数的增多,所占空间会变大, 树相应就会变高,磁盘 IO 次数就会变大。
  3. 应用 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,查问完结。如果存储的是磁盘地址,还须要依据磁盘地址到磁盘中取出数据,查问终止。(这里须要辨别的是在InnoDBData存储的为行数据,而 MyIsam 中存储的是磁盘地址。)

TCP 怎么确保传输可靠性

面试官问我这个的时候,我的答案是 我不会(是真的,我是真的不会)!!!

这篇的话就大略讲一下保障可靠性几点,不做深刻的剖析。我也不会呀,是时候要好好钻研一下网络相干的货色了。

  1. TCP在建设连贯采纳三次握手和断开连接四次挥手的连贯管理机制(过后我只答复了这一个,而后面试官来了一句就因为这个就能确保传输的安全可靠吗。我是真想答复是的)。
  2. 测验和。TCP测验和的计算与 UDP 一样,在计算时要加上 12byte 的伪首部,测验范畴包含 TCP 首部及数据局部,然而 UDP 的测验和字段为可选的,而 TCP 中是必须有的。计算方法为:在发送方将整个报文段分为多个 16 位 的段,而后将所有段进行反码相加,将后果寄存在测验和字段中,接管方用雷同的办法进行计算,如最终后果为测验字段所有位是全 1 则正确(UDP 中为 0 是正确),否则存在谬误。
  3. 序列号。TCP将每个字节的数据都进行了编号,这就是序列号。作用如下:
  • 3.1 保障可靠性(当接管到的数据总少了某个序号的数据时,能马上晓得)。
  • 3.2 保证数据的按序达到。
  • 3.1 提高效率,可实现屡次发送,一次确认。
  • 3.1 去除反复数据。
  1. 确认应答机制(ACK)。TCP通过确认应答机制实现牢靠的数据传输。在 TCP 的首部中有一个标记位——ACK,此标记位示意确认号是否无效。接管方对于按序达到的数据会进行确认,当标记位 ACK=1 时确认首部的确认字段无效。进行确认时,确认字段值示意这个值之前的数据都曾经按序达到了。而发送方如果收到了已发送的数据的确认报文,则持续传输下一部分数据;而如果期待了肯定工夫还没有收到确认报文就会启动重传机制。
  2. 超时重传机制。当报文收回后在肯定的工夫内未收到接管方的确认,发送方就会进行重传(通常是在收回报文段后设定一个闹钟,到点了还没有收到应答则进行重传)。
  3. 流量管制。接收端解决数据的速度是无限的,如果发送方发送数据的速度过快,导致接收端的缓冲区满,而发送方持续发送,就会造成丢包,继而引起丢包重传等一系列连锁反应。
  4. 拥塞管制。流量管制解决了两台主机之间因传送速率而可能引起的丢包问题,在一方面保障了 TCP 数据传送的可靠性。然而如果网络十分拥挤,此时再发送数据就会减轻网络累赘,那么发送的数据段很可能超过了最大生存工夫也没有达到接管方,就会产生丢包问题。为此 TCP 引入启动机制,先收回大量数据,就像探路一样,先摸清以后的网络拥挤状态后,再决定依照多大的速度传送数据。此处引入一个拥塞窗口。

Http 与 Netty 数据传输的区别

实际上这道题是问 RPC 带进去的。过后问了一个 DubboFeign 有什么的区别?这时安酱就往陷阱外面跳了,因为 Dubbo 应用的是 Netty 传输,而后通过反射调用本地办法,而Feign 是通过RestTemplate 调用 Http 接口的形式。而后就正中面试官下怀,从而引出了这个一个问题,我又答复了个寂寞。

这里的话次要是针对于 HttpScoketNetty自身也是反对 Http 的。

  1. HTTP是一个属于应用层的面向对象的 协定 ;而Scoket 是应用程序与 TCP/IP 协定交互提供套接字 (Socket) 的接口。
  2. HTTP属于短连贯(尽管反对长连贯,然而连接时间是由服务器决定的);Scoket属于长连贯,通常状况下Socket 连贯就是 TCP 连贯,因而 Socket 连贯一旦建设, 通信单方开始互发数据内容,直到单方断开连接。
  3. HTTP是基于申请 / 响应模式,一次申请过程中,Server端和 client 端的角色是不能调换的;Scoket属于全双工通信,Server端和 client 端是能够互相通信的。

比拟形象的比喻:Http是轿车,提供了封装或者显示数据的具体模式; Socket是发动机,提供了网络通信的能力。

参考:

一口气搞懂 MySQL 索引所有知识点

TCP 如何保障可靠性

退出移动版