计算机基础
堆和栈
什么时候用堆?什么时候用栈?栈有什么作用?Golang 的变量在栈还是堆?堆、栈有没有上限?有的话和什么有关?
数据结构
Slice 空间是怎样分配的?双倍扩容,原来数据复制过去。
Golang 的 map 是什么结构 Golang 的 map 是什么结构,遍历是否有序, 什么是 Hash 表? Hash 表的查询效率? 解决碰撞有什么方法?
线程
线程是否越多越好吗? 线程切换消耗大不大?
协程是否越多越好吗?要区分线程调度(内核上下文切换)与协调调度时(进程内上下文切换)机制。
网络
TCP 协议
TCP 建立过程是怎样的,最要的工作是什么?协商序列号。
TCP 关闭过程,为什么要四次挥手?因为TCP是全双工的。
Client -> Server, Client 主动关闭链接, TIME_WAIT
发生在那端?服务器有很多 TimeWait 一般是什么情况 主动关闭端。有很多 Timewait 证明是服务主动关闭连接,存在有很多短链接。
Client 和 Server 已建立了 TCP 连接, Client 正在调用 Read 阻塞,Server 进程崩溃后,Client 会怎样? 进程崩溃,操作系统会关闭文件描述符,Sever 进入主动关闭流程。
通过 TCP 传输文件,为什么还需要对收到的文件做正确性校验?
HTTP 协议
简述 http 协议格式,文本协议能不能传输二进制?http 可传输图片的方法(content-length)。
http 与 https 关系是什么?简述 https 协议作用,描述出 https 握手过程的加分 。
什么是 http 中 的 keepalive,怎样做到 keepalive ? http1.1 才支持 keepalive,一个 tcp 连接顺序发送请求(遵守一问一答顺序),http2.0 多路复用。
数据库
索引知识
数据库索引使用了什么数据结构?为什么要使用这个数据结构?
一个表的字符串字段 A 已经建立了索引,使用查询条 A == ‘abc’ 是否能用上索引?使用查询条A != ‘abc’ 是否能用上索引?为什么?因为 A!=‘abc’ 在 B+ 树查找过程无法比较大小,无法进一步定位孩子树
有个表 a 有主键 id, 说明一下 select * from a order by id desc limit 10, 1
和 select*from a order by id desc limit 100000, 1
的效率差别? offset 为多少,就要遍历多少
一个表有一个联合索引(A,B),如果查询用 A=1 能用上索引吗,B=2 呢,为什么?
limit 的局限
用什么办法遍历一个有主键 id 的 3 亿数据表
算法
算法能力考察
有一个 100 万个不相等的乱序的整数, 用最快方法将其分成相等的两部分,要求前一部分每个数都比后一部分每个数小?使用快速排序的思路
在内存中有 100 组有序数组, 每组 10 万个元素,用最快方法将他们合并成一个有序的数组。使用堆
基本知识
如何判断一个链表有闭环
Golang
多线程编程
如果多个线程并发读写一个 map,会产生什么结果?为什么会产生这种结果?有什么办法保证并发安全?
Golang 中对一个 int64 进行高并发更新(增减),有什么办法保证并发安全? 并发编程的理解,可以有 3 种方式:(1)锁(2)atomic包(3)channel - 多生产者单消费者
协程,线程,进程
描述 goroutine 调度、切换机制。
Channel
Golang chan特性 chan 为什么不用锁,底层是怎么实现的?
什么时候会阻塞,怎么判断会阻塞? 1)chan底层是用了锁+双向队列实现。2)投递前可cap、len函数判断是否相等,但要锁住。第2个方法是用select default,实际编程中select必需加 default处理逻辑。
Redis
基本数据结构
string、list、set、zset、hash,每种数据结构的使用场景,实现原理
Redis Redis 用法如何用 Redis 实现一个分布式锁 最初级的回答是SETNX。更好的回答是考虑到原子性,用 Lua 脚本
原理
Redis对设置了TTL的key,是如何实现key的过期的? 能回答出 2 种过期方式:主动和被动(惰性)。如果能回答出主动方式的随机抽样流程,加分。
Redis的key淘汰策略有哪些? 各有什么特点?常用的有volatile-lru、volatile-ttl。LRU 算法的流程是什么
redis 有没有 stop the world 问题?什么时候会出现?为什么?回答:redis 是单进程、单线程服务,单个任务处理时间过长,就严重影响并发性能。如持久化时、处理返回大 values 值数据时、从一个很长的 list 中删除一个元素时等场景。
系统设计
短网址服务
输入一个长网址,编码返回一个短网址(重点是编码方法的考虑,比如用什么方式表示短网址,能表示的量有多大)
如何通过短网址找到长网址?
HTTP重定向是选301还是302? (1)编码方式:用ID生成器生成一个64bit整数,然后把这个整数编码成英文数字的字符串(注意考虑要多长的字符串?),如果回答md5之类的hash方法的,会有冲突问题。
通过kv存储,key是短网址,value是长网址,redis mysql都可以
301(永久重定向)和302(临时重定向)的区别主要在于搜索引擎的行为。如果想要统计用户请求信息,用302.
高并发 ID 生成服务
全局唯一
ID体积尽可能小
ID按照时间有序