首先这家公司的面试流程是真的快,前天刚进行完hr面,以为是隔一段时间再进行技术面的,然后面完一面hr面后,hr叫我先别关会议,现在叫面试官过来进行技术面。我就有点慌了,因为挺久没背八股文了,而且项目那些也没准备好,所以找了个理由另外约时间进行技术面。
然后昨天就技术面了,更想不到他的二面加三面是连在一起的,就是两个面试官轮着来,面试整整持续了两个多小时,面试之后感觉脑子都要抽筋了。
面试时间:2022.12.14
面试形式:一对一 腾讯会议(值得一提的是这里面试官也开了摄像头,感受到了面试官的尊重,因为一般面试官很少开,只要求候选人开)
求职岗位:go开发工程师
面试持续时间:两小时+10分钟(因为是两轮面试不间隔,所以时间比较长)
由于面试涉及到的问题比较多,加上前段时间确诊了,这几天一直休息,那些问题忘得七七八八了,这里只记录印象深刻而且不会的。
1.使用两个栈实现一个队列
思想:一个栈用于入栈,直接push就行;另一个栈用于出栈,要把入栈的栈的全部元素压入这个栈,并pop栈顶元素。
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
}
public int pop() {
if(stack2.size() == 0) {
while(!stack1.isEmpty()) {
int temp = stack1.peek();
stack2.push(temp);
stack1.pop();
}
}
int res = stack2.peek();
stack2.pop();
return res;
}
}
2.如果先清除缓存再修改持久层数据库会怎样?
无论是先修改数据库还是先删除缓存,在多线程并发和读操作的速度远高于写操作的速度的环境下都会有发生脏读的可能,但是总体来说先修改数据库发生脏数据的可能性要低于先删除缓存发生脏数据的可能性,所以大多数情况下,在不想过多设计增加工作量的情况下,一般设计为先更新数据库再删除缓存。
3.无缓冲channal的使用场景
这个确实不太清楚,网上都是介绍概念和底层,关于使用场景的资料比较少。
4.实现限制某一时刻的最大goroutine并行执行数。
第一种方法是计数法,维护一个全局变量并加锁,开启goroutine时判断该变量是否大于0,进入时-1,结束时+1。
第二种方法是使用channal,类似于令牌桶算法。
5.GMP模型中M去取绑定的队列的G时,队列为空会如何?
去其他绑定的队列偷,假如其他队列也空则去全局队列拿。
追问:为什么要设置绑定的队列和全局队列?
这个网上资料也比较少,其实面试官最后给我作出了解答,但我没记太清楚。
6.说一下缓存雪崩、缓存击穿、缓存穿透(只说出了两个)
缓存雪崩:同一时刻缓存大规模失效,大量请求直接走数据库。
解决:避免设置相同的过期时间;使用缓存集群;熔断机制。
缓存击穿:针对同一个失效key大量请求直接走数据库
解决:控制过期时间;使用锁(损耗性能)
缓存穿透:针对大量缓存中不存在的key直接走数据库
解决:设置value=null放入缓存;布隆过滤器