一面 (7.15 46min)
数据库
项目中自己最大的困难,如何解决的
聊千万级别的数据表格优化
项目收获 --- 问到自己数据库存的什么数据
PLC上位机,存各种通道数据
索引类型 - 刚提到索引,那具体有哪些索引类型了
单列、多列(复合索引)、覆盖、前缀索引,聚集、非聚集
多列索引实现原理
B+树,然后回答了B+具体的实现原理,相比B树区别
二叉树和哈希适不适合做索引
- 二叉树这里主要用红黑树,AVL因为旋转次数较多,一般不用。但两者都不适合索引,因为深度太大,查询慢
- 哈希索引是有做索引的,根据哈希值确认对应位置,访问速度快,但不适合范围查询。在InnoDB中有将热点数据建立自适应哈希
数据提交了会不会丢失 -- 引出事务,和事务恢复过程
我先抛出事务提交不会丢失数据,然后分析事务恢复过程。
说恢复的时候,先以一个更新语句为例。会经过两层,SQL上层和存储层。然后具体讲了binlog,undo log,redo log 如何完成的过程
undo log作用
原子性和MVCC
undo Log等日志会不会丢失
有可能,先写入到缓存。具体讲了undo log写入到 redo log日志中,redo log写入缓存,最后才刷新到磁盘。
提升了IO性能
最左原则 -- 给了一个题
最开始说不大了解,还是给了一个题,下列索引能不能共用。
我说1 2肯定是可以,因为顺序是一致的。4由于顺序不一致因此不对。
3我不能确定
面试官给出了补充
顺序没有太大关系,MySQL会自己优化,但3和4都不行
补充
后面和同学聊了下,这里复合索引会有顺序要求。从左边那列必须存在。比如 col1 col2 col3 。 那么当只涉及到col2 col3的时候,索引就失效了。 另外像底下题目,当a >= x 那么会使用a的所有,但b的索引就阻断了
(a,b) 1. a=x and b =y 2. a=z 3. a>=x and b=y 4. b>=x and a=y
操作系统
进程间的通信方式
6种,后面说还一种,不知道
那种通信方式最快
我回答的共享内存
现代计算机多核CPU下,如何保证数据一致性,或者说如何工作的
三级缓存,缓存行,缓存锁
在一个读多写少的情况下,如何设计让性能提升
我说的使用双缓存,一份用来读,另外一份用来写,然后再交换数据指针。并拷贝一份新的(类似copy on write)
对某个数据的读写能否保证数据原子性
我以java为例,基本数据可以,非基本数据会有问题,因为超过一个缓存行的长度,那可能分两次读写
网络
time-wait状态知道吗,为什么要有time-wait
四次挥手的2MSL,说了两个原因,
- 服务器:如果发送FIN+ACK没有收到C的回复,则会再发送一次,因此C的2MSL为了避免S的重传
- C发送完最后一个请求,2MSL时间可以等待本阶段产生的所有报文段从网络中消失,不在新的响应中出现
服务器端可不可能出现大量处于time-wait状态
一开始没说出来,提示了下,比如nginx反向代理,然后我就分析了一通
nginx了解吗,反向代理的时候,如何保证负载均衡
这个其实大致知道的,假装想了会,说了轮询、加权轮询,随机,最少连接,加权最少连接,IP哈希保证会话一致性。
刚说到哈希负载均衡,那如果新加入节点,如何保证会话仍然落到同一个节点
开始说了说取消服务器的状态,统一服务器管理session。
后面面试官说如果节点就是有状态的,怎么解决。
想了半天不知道,面试官说用一致性哈希,让我了解下
算法
判断一个树是否二叉搜索树
中序遍历即可。我写的 pre节点用Integer.MAX_VALUE。说不大好,不直观,我想了想,用节点,先给null值。
二面(7.22 50min)
聊项目
详细说明业务场景,索引建立在哪一列,查询语句是什么
这里自己其实有一点没有太明白,SQL Sever的最左原则是否适用,需要查一下
点赞点踩介绍
介绍了点赞点赞逻辑,和一个异步过程。
这里被面试官指出:当前的方式和缓存时相悖的,应该sql存数据,redis缓存,这样才能提高访问速度。
基础
redis和mysql哪个更快,为什么
主要内存和外存的磁盘IO读写区别
虚拟内存是怎样的
内存空间不足,价格昂贵,虚拟内存提供进程一个抽象的私有的连续逻辑内存地址
从作用,然后覆盖,交换降到虚拟内存
虚拟内存和物理内存如何管理的
页表映射
页面置换算法
FIFO,LRU,第二次机会,时钟轮转
HTTP和HTTPS区别
加密 + 认证 + 完整性保护
- 默认端口:80/443
- HTTP不安全、HTTPS在SSL/TLS之上,对称和非对称加密,安全
- HTTP + 加密 + 认证 + 完整性保护 = HTPPS
- 混合加密:S给C一个公钥,C利用公钥加密对称加密共享秘钥,S利用自己的私钥解开共享秘钥。最后使用共享秘钥加密进行通信
CA认证具体过程,如何保证正确性
服务端申请证书,和客户端去CA请求证书是否正常的一个过程
算法题:LeetCode 41 缺失的最小正数
反问
三面(7.28 55min)
项目
前面聊了很多项目方面的吧,谈谈你对前面面试的感受
面试是一个学习与提高的过程,一面的时候最左原则不是很懂,学习了下,在自己项目里也对应修改了下,效果的确要好一些;
二面提到的redis和mysql的运用,自己重新理了下逻辑,将项目修改为一个异步过程。balabala
之前谈的第一个项目,那来聊聊第二个项目
这里说了下大概场景,和自己的优化,后面聊到订阅者模式和pull方式获取数据,这个就不详细说了。
基础
虚拟内存二面问到了,那你说说虚拟内存置换算法
这个二面其实也问到了。前面没有回答OPT,这次加上了
前面有问到网络吗,那你说下一个网址输入到到服务器会经过哪些地方
我确认了下问题,不大需要回答具体哪个协议的过程。从本地计算机,不知道自己网关路由器时就ARP获取MAC地址,然后到达路由器,路由器根据路由选择协议,不断选择下一跳,在生存时间内到达对方服务器,那么将获得对应响应
刚说到路由器到下一跳,那么如何确定下一跳位置呢?
自己从系统内路由选择协议和系统外路由选择简单回答了下。
问一下MAC相关的,MAC数据哪一层结构
数据链路层
那MAC地址是如何确认一台设备的呢
前24位厂商,后24位计数编号
MAC地址可不可以相同,相同会有什么影响
mac地址可以修改网络地址,但本机硬件不可以,相同的话会造成同一个局域网两台设备冲突。
那比如我两现在的MAC地址一样,能传输到我这边来吗?
我猜测可以,从链路层每次都会修改对应的下一跳MAC地址,当时跟面试官说这是我猜的,他笑了笑。就开始其他的了
算法概率题
概率题-- A, B两个人,轮流抛硬币, 谁先抛出正面谁就赢,A先抛,求A赢的概率?
因为输的概率是1/4+1/4 * 1/4+1/4 * 1/4 * 1/4+.....+1/4的n次方,极限值为1/3,所以赢的概率是2/3。
这样的话是不公平的,那如何公平呢?
抛一次,正的A赢,反的B赢
那假设都要抛了
两次,正正,正反 A赢, 反正,反反B赢
算法题 -- 剑指offer 3改编
int 数组, size N, 元素范围 0~ N-1, 求存在重复的元素。 要求: 时间O(N), 空间O(1)
一开始只想着求一个元素,将数组都加个1,则范围变为 1 - N,则可以变成一个链表求环的入口问题,说了半天,面试官没听太懂,让我先写,我写到一半,面试官说这是只找一个嘛,要找多个怎么办。
又想了好一会,跟面试官说了另外一种思路,后面面试官提示了下,改成另外一种方案了,代码如下。
class FindRepeatNum{ public Set<Integer> findRepeat(int[] nums){ int n = nums.length; Set<Integer> res = new HashSet<>(); if(n == 0) return res; for(int i = 0; i <n; i++){ int idx = nums[i] % n; nums[idx] += n; if(nums[idx] / n >= 2) res.add(idx); } return res; } }
更新:上述代码有个问题,应该是nums[i] % n,之前写的是nums[i % n],这个是有问题的,感谢“我非真心”小伙伴私信提醒。
补充个示例:
第一行是下标,第二行是数组数据,第三行是遍历一遍的数据
0 1 2 3
1 0 2 2
4 3 8 2
这里遍历到下标3的时候,下标2对应的数字变为8,对应出现两次,即可找到答案。相应的如果有多个数据,那么也是一样的逻辑
自学过程有看那些书
反问环节
小结
相比于很多人流程快速,我算是比较慢的,可能教育投的人也多,自己投的也不早。不过整体算比较顺利,面试官也都很有耐心。
总体而言,一面相对来说问的最深最广,可能也是自己操作系统这块比较薄弱。二面项目问的最深,光项目就问了二十多分钟,也给了我很多启发。三面从一个新的维度问了一些项目问题;算法题上,面试开始时说这场面试40-45分钟,算法题留了十分钟给我做,当时想得有点紧张,面试官很有耐心的引导了,虽然做出来了。最后也不知道能不能通过,但反问环节给了一个比较重要的点:在接下来一年的可以补一下科班学的那些课程,包括编译原理、离散数学等,这样入职后会有不一样新的认识。对于技术栈,MQ也多了解些。
前面也面了些公司,字节算是已经面完整的第一家公司。不管怎样,面试也是一个提高过程,感觉自己语言表达和具体技术深度的确都有一定的提升。前面看了很多小伙伴们分享的面经,这篇简易的面经就当做一个记录和分享。
最后,许愿通过!
更新:牛客许愿很灵哇,刚发完没多久,hr发消息说三面已通过。
全部评论
(23) 回帖