先总结一下,面试官特别随和,但是我太菜。拷打完我的秒杀项目后,突然问我C++的八股,后续拷打操作系统和计网。
笔试题很简单,一道链表倒数第k个元素,另一道和最大子序列。面试官说没有C++基础反正也过不了面试,笔试题看看就行。
项目:
1.redis缓存空对象用于解决缓存击穿,是否有做过压测?为什么选择缓存空对象,而不使用布隆过滤器?
编了一个2000QPS的并发量,但是面试官说压测要一直提升直至检测出性能瓶颈,虽然实际开发的某些业务功能不需要那么高,但是需要必要的检测。
缓存空对象实现简单,维护方便,代价是占用额外的内存空间;而布隆过滤器实现复杂,可能误判。
2.redis使用setnx实现分布式锁,如何控制锁的有效期?
用redission框架的看门狗机制,每隔一段时间检测是否持有锁,业务结束后释放即可。
3.redis缓存击穿使用互斥锁解决方案的利弊?
互斥锁保证了数据的强一致性,不消耗额外内存,实现简单,缺点就是损耗性能(线程需要等待)的同时面临死锁的风险,而逻辑过期与之相反。
4.为什么使用lua脚本?听过pipeline吗?
lua脚步保证操作的原子性,但不适用于多线程并发。pipeline在实际生产更并发场景更实用,但无法保证一致性。
八股:
1.C++虚函数和多态原理及作用
2.C++多重继承的构造函数和析构函数
操作系统:
1.linux查看硬盘信息
df -h选项可以以人类可读的格式输出硬盘使用状况
2.linux查看网口
tcpdump 类似的有windows中的wireshark
3.linux查看网络状态
netstat 可以得到网卡接口上的路由表、网卡接口信息等。在网络编程中用来显示TCP连接以及状态信息
4.内存管理机制?
连续内存管理和非连续内存管理。后者细分为页式、段式和段页式管理机制。
5.进程和线程区别?进程之间通信方式?
管道 消息队列 共享内存 信号量 信号 socket
计网:
1.TCP三次握手?详细状态?为什么不是两次?
客户端:CLOSED、SYN_SENT、ESTABLISHED
服务端:LISTENING、SYN-RCVD、ESTABLISHED
2.TCP和UDP区别?