目前oc率100%,继续保持。
因为自身在绿盟实习,这里纯玩啥也不用干,问了下学长的意见就不去了,打算狠狠带薪沉淀了,过俩月all in大厂。
-----我是一条分割线------
一面:
》自我介绍
说了下自己的学校,专业,年级,工作室负责的事,最近在学的东西,微服务,cs课程比如raft。
》展示下自己最值的一提的项目
我选的是一个raft相关的项目,把6.824移植出来弄了个高可用的kv,开屏幕共享展示了下容错表现,以及状态机实现思路,亮点是基于消息/事件,事件循环。
》你对于raft的理解,你认为raft是一个强一致性还是最终一致性的?
准确的说叫线性一致性,但是对程序来说可以看成强一致性的。这里我说了下我对raft的理解就是多个节点绑定成为一个不可宕机/或宕机机率非常小的单机节点,而单机节点就可以理解为一般意义上的强一致性了。
》你说下redis集群的一致性?最终一致性或强一致性?
redis主节点负责拿写入操作,从节点重放,其实会发生丢数据的情况,可以认为它是最终一致性,且会丢数据,根本不是强一致的。
》CAP理论了解吗?
说下AP系统或CP系统,trade off说下,常见场景说下就OK。
》有没有使用过redis,说下自己做了什么功能?
可以说zset实现排行榜,聊下跳表,红黑树,时间复杂度。可以说缓存。可以说stream实现消息队列。set实现共同关注。
》说下B+树和跳表有什么优劣?
先说下它们最底下一层都是链的数据,范围查询都很方便。此时可以说一下红黑树范围查询实现很难受,要返回父节点,来回捣腾。可以说B+树实现困难,跳表实现简单。可以说B+树存放2kw数据就只需要三层,IO少,查询快。那么为什么使用跳表? 可以说内存数据库不存在磁盘IO,此时只需要插入的快就不错了,B+树为了平衡会做额外的算法,较慢。
》为什么四次挥手?
从半关角度的方向说,说一下FIN包过程状态。扯一下muduo那本书的设计。
》进程线程协程?
写过简单的时间片调度器,简单聊聊设计就行。
》协程在操作系统层面是可见的吗?
协程是程序调度器自己切换的,寄存器信息都放内存里的,操作系统不知道这块内存干啥的。
》go的map并法安全要求
简单八股,说下write的标志导致panic就行。此时可以扯一下sync.Map的设计。
》说下gc过程
白给了,没背,直接说暂未了解。回头看刘丹冰的视频吟唱八股。
》mq你用过吗? 如果用redis实现延时队列
我说的轮询+list。面试官觉得不好,我从定时器设计角度说了下堆排,感觉差不多。其实我没有怎么了解这个,说的有漏洞,其实真的答案是zset,score存时间戳,排进去就立马把时间戳小的挤前面了。
》如何实现限流
说漏桶,令牌桶,滑动窗口。之前没了解这方面,只说了漏桶的思路,面试官好像不满意,他应该想听滑动窗口。
》写道简单题,acm模式,输出最长连续递增子序列的长度,1 2 3 4 1 1 1 7 8 9 10,输出5
简单dp,3min秒了。
》反问
反问1,业务用的什么框架? 说golang的gin,提供http服务。
反问2,对我有什么建议/评价?面试官的大概意思是让我多了解点常见的问题,比如常见八股,限流,gc,redis实现延时队列,实现mq诸如此类。
反问3,如果有下次面试,是什么时候?他说之后流程不是自己负责了。
面试官人很好,一直鼓励我,说话很委婉,爱了!
二面:
最汗流浃背的一集,感觉是个大佬,简单问题没答好。
》问下redis,说下基础数据结构
草了,脑子抽了压根没背,纯乱说,真实个煞笔,真想给自己两耳屎,听录音真尴尬啊!
》说下zadd, zcard, zrange的时间复杂度
简单。
》说下golang基础,下面输出是什么
简单,考察defer先进后出。
》golang基础,说下下面能通过编译吗
草了,这个脑抽忘了,我说第二句会不通过编译,他说错了。汗流浃背了。
》说下下面语句后的len和cap
简单,这个是切片的扩容策略,扯一下之后版本的优化,在达到一定的大小后不再2倍扩容。
然后又问了,a的地址发生改变了吗?这个问题要分两段答,本身没有改变,但是底下的pointer指向了新的地址。
又问如果a再次append一次呢? 两倍扩容。
》说下下面的输出
简单,这就是个闭包。输出1,2
》谈谈下面的代码。
我说会panic。
》说下预期输出结果
我坚持认为结果是未定义的,abc,abb,acc,ccc都可能。但是面试官坚持说ccc。无语了啊!!这里我说了go1.22的改进,以及v其实是同一个变量。
》goroutine什么时候会让出时间分片?
领域展开,可以说大栈消耗的函数调用,可以说信号抢占,直接说自己实现过信号抢占的调度器。可以说sleep这些api,read底下的wait会等待fd readable,此时被挂起。还可以说golang比较重要的信号量,好多sync的实现都依赖于它。还可以说系统调用会开新的线程,此时也会发生调度。我还说了调用c语言,但是我不确定,这点需要研究下。
》读写锁原理?
不知道,我说了C语言的锁实现原理。CAS,Fetch And Add,然后futex系统调用。这个真得去研究下代码了。
》写sql,说下获得某一天得所有data
简单,create_time限制一下范围。
又问,再考虑一下分页问题,用limit, offset就行。
》网络方面,说下拥塞控制
草了,没背!!!胡言乱语,汗流浃背了!!!
》http1.1和2的重要升级,3和2的区别
啊!!没背,只说到了队头阻塞。真得好好背了!3和2区别说了quic,我说了udp,不可靠得udp上面重新发明tcp。
》10TB url,50M内存,说下如何判断path出现得种类数。
这个很简单,把同样的url hash到同一个文件中,可以扯下mapreduce思想。
》反问:
总结:去看看小林coding的mysql,redis,网络,狠狠准备八股。去看刘丹冰/小徐同学的gc,内存管理,以及一些sync的实现原理,比如mutex和rwmutex, waitgroup, cond,context,channel。去研究下golang调用c语言的原理。