面试题记录
1、项目中遇到的问题?
个人讲的是运营管理系统
(运营配置麻烦、活动结束下架麻烦、限时限免活动设计、广告系统设计)
2、HTTP 请求全链路?
浏览器解析域名和端口
域名通过DNS解析我们IP
三次握手
客户端发送数据、
服务端响应数据
四次挥手
断开链接
3、HTTP 和 TCP 关系?自己实现 HTTP 请求?
HTTP 依赖于 TCP、
TCP在网络层、HTTP在应用层
应用层:网络服务与最终用户的一个接口
表示层:数据的表示、安全、压缩。
会话层:建立、管理、终止会话
传输层:定义传输数据的协议端口号
网络层:实现不同网络之间的路径选择
4、HTTP 和 HTTPS 区别?
安全性、CA证书、效率、端口讲
5、请求会走到CDN原理?
请求CDN域名
CDN 返回我们 CNAME(域名和全局负载系统关系)
拿到CNAME后,在根据我们资源,请求返回的节点信息
此时CDN会按照IP/内容/地区找到最近的资源缓存位置
返回当前节点服务器给我们
6、Go 语言 Map 底层数据结构了解?
1. map的底层实现原理? hashMap 实现
2. 为什么遍历map是无序的?
hash0 随机种子
官方就这样设定
3. 如何实现有序遍历map?
先把key值进行排序,在用key进行查询
4. 为什么Go map是非线程安全的?
非安全场景使用比安全场景多
加锁会导致我们map效率变低
5. 线程安全的map如何实现?
sync.RWmutex
sync.Map
6. Go sync.map 和原生 map 谁的性能好,为什么?
sync.map 采取空间换取时间思想
在读和删场景上的性能是最佳的,领先一倍有多。
在写入场景上的性能非常差,落后原生 map+锁整整有一倍之多。
7. 为什么 Go map 的负载因子是 6.5?
太大了会导致冲突加剧,但是可以提高空间利用
太小了浪费空间,取了一个中间结果
8. map扩容策略是什么?
装载因子超过阈值
overflow 的 bucket 数量过多
7、MYSQL 索引数据结构?为什么不用红黑树?B+树的优点?
B+树
优点:
1、基本实现了二分法查找我们数据,时间复杂度logN
2、实现了我们的范围查询
3、每个节点可以存储多个节点,避免我们的树过高,减少磁盘I/O读写
红黑树是有序的,但是无法做范围查询,B+树叶子才是存储我们的数据,我们做范围查找是,只需要做偏移即可,红黑树不行,时间复杂度过高
8、Mysql 和 Redis 区别?
结构不一致: 结构化和非结构化
存储:Redis 用内存、DB主要做存储
事物:Mysql支持ACID,而Redis语法没有错的情况下,一个失败了会继续执行
9、Mysql 百万大表怎么做分库分表?
1、把原数据表复制一份,进行分库分表
2、可采用双写机制 或者 补偿机制(inputtime 和 updatetime进行补偿)
10、服务器上抓过包么?有进行三次握手分析么?
tcpdump
11、linux top 命令参数讲解?
load average: 系统在之前 1 分钟、5 分钟、15 分钟的平均负载
99.2 id: 空闲 CPU 占用的 CPU 百分比
0.0 ni: 改变过优先级的用户进程占用的 CPU 百分比
0.0 wa: 等待输入/输出的进程占用的 CPU 百分比
12、一个服务调另外一个服务(QPS 500),你会怎么做?
限流(redis/令牌桶算法/漏桶算法)
Redis 缓存,避免一直请求另外底层服务
黑白名单
队列
保底
13、算法
leetcode 3 无重复子串
func lengthOfLongestSubstring(s string) int {
var maxLen int
start, next := 0, 0
l := len(s)
if l <= 1 {
return l
}
mp := map[byte]int{}
for next < l {
if val, ok := mp[s[next]]; ok && val > 0 {
mp[s[start]]--
start++
continue
}
mp[s[next]]++
maxLen = maxInt(maxLen, next - start + 1)
next++
}
return maxLen
}
func maxInt(a, b int) int {
if a > b {
return a
}
return b
}