前言
	面试了差不多两个月,从bat到只有一个后端的小公司都面过,对面试常问的问题做一些总结。
八股文
网络、web服务器
- 网络模型
osi七层。tcp/ip4层 
- tcp
三挥四握及其客户端与服务器的状态、排查,拥塞控制,滑动窗口,报文结构,为什么可靠,粘包 
- upd
一般和tcp做对比,需了解基础 
- http
http1,http1.1(和tcp keep-alive作区分),http2都需了解,https的ssl协议需了解 
- nginx
工作模式,一些简单配置,用途,负载均衡策略 
数据库(mysql)
- 索引结构
为什么使用b+tree,b+tree结构,什么时候会退化,和b tree、skiplist 比较 
- 索引
类型,使用索引的优劣(就是空间换时间),索引的使用 
- 引擎
一般就说说myisam与innodb异同。 
- 事务
概念,隔离级别以及解决的问题,mvcc以及实现,redolog,undolog。分布式事务2PX 3PX 
- 日志
binlog redolog undolog relaylog 慢日志 概念功能 
- 构架
分库分表,主从,读写分离 
- 如果问mysql优化 建议从构架设计、数据库设计、sql三个方面说
 
缓存(redis)
- 为什么单线程也高效
数据都在内部里,io多路复用,多线程上下文切换的损耗 
- string hash list set sortset 的底层结构和场景必须清除的了解
我之前在《redis设计实现》看 list 由linkedlist实现,后来发现之后是升级quicklist节省内存空间。hashmap和skiplist是重点。 
- redis主从过程
9个过程,百度就有 
- cluster
槽 ,hash一致性,大key(拆),热key(代码实现负载均衡) 
- 内存淘汰策略
lru 可对比朴素lru,innodb缓冲池的lru,lfu 
- bitmap hyperloglog
 
- 过期键删除
惰性 定期 结合 
- 缓存与数据库一致性
双删 延时双删 订阅binlog 
- 缓存穿透雪崩击穿
提到布隆过滤器就要了解原理(位数组+几个哈希函数) 
- 故障转移
参考raft 
队列
- 异步 削峰 解耦
 
- rabbitmq感觉没啥好说的,kafka问就是不熟0.0
 
elasticsearch
- 基础概念
 
- 单机数据写入过程
为何准实时 
- 多机数据读取/写入过程
协调节点与哈希路由算法 
- 倒排索引
分词, trim dictionary,跳表,trim index,postling list,fst,bitmap 
linux
- top free 问的多点
 
- epoll select poll
 
- 协程 上下文切换 用户态内核态
 
算法
- 除了一线厂,其实只要了解一下几个排序算法的实现、时间复杂度、优劣就行
 
- 面一线厂肯定要刷leetcode,感觉刷个300道差不多,字节的最难
 
项目
- 自己的项目一定要有通彻的了解,最好做一下总结,用到的技术不管是不是自己写都要了解。有些场景的设计要思考为什么(没有原因也要想个理由)
 
其他
- 如果用了微信小程序就要知道auth2
 
- 工作中看中什么? 无非就是平台/工资/项目/团队
 
- 关于语言 我写php的,感觉php也没啥好问的,一般也就垃圾回收和swoole,php7特性
 
- 设计个连接池
 
后记
- 我准备面试大概用了一个月不到,后面的边面边看。感觉面一线厂还是不够,面了几次一面挂,菜的离谱。感觉准备面试也是对自己的提升,对业务和技术的理解都提升了很多,比如mysql很多围绕磁盘io,redis很多围绕使用更少内存
 
- 本来打算每次面试都更新的,后来觉得重复度很高就没写了
 
- 就写了写技术面,hr面。。。我被hrbp挂过两次,就不误人子弟了