基础知识
- 32位系统和64位系统有什么区别?
- 机械硬盘和SSD有什么区别? 那些DB对SSD做了优化? 优化原理?
- 栈和堆的作用是什么?
- 内核态和用户态有什么区别? (星云开物)
数据库
- MySQL为什么使用B+Tree?
- 数据库查询如何优化?
1.查看是否能使用覆盖索引,减少回表时间,比如执行搜索指定的列而不是select *
2.是否能组合联合索引,联合索引要考虑最左匹配原则
3.是否对索引进行了函数操作或者表达式计算导致索引失败
4.利用子查询优化多页查询场景
5.通过explain命令来查看SQL计划,通过show profile查看系统资源消耗
6.执行事务尽可能减少锁持有时间,比如先插入后修改,修改会有行锁
7.考虑查询条件少的是否可以放缓存
8.字符串检索场景导入Elasticsearch,通过binlog同步时间
9.是否主从架构,实现读写分离
10.数据量大要分库分表
11.旧的大量数据是否可以离线存储
redis
- redis那些操作是O(1)操作?
- 基础数据结构? 怎是现实的?
字符串,字典,列表,集合,有序集合
1.字符串使用SDS结构体
2.字典使用哈希表,使用渐进性rehash,新增写入更大的哈希表,删除和修改两个哈希表同时进行,使用rehash可以避免数据单进程redis复制花费太多时间,阻塞其他命令
3.列表使用链表,包含头尾指针和节点数量
4.整数集合使用数组,有字符串则保存在哈希表中
5.有序集合使用跳表,多层链表,支持平均O(logn)查找 - 持久化方案? 有什么优缺点?
RDB通过快照形式保存,可以在配置文件配置指定时间内的写操作次数触发,也可以通过bgsave命令触发redis子线程生成RDB文件
AOF采用日志追加写记录形式,默认不开启,通过重启redis恢复数据
RDB优点:适合大规模数据恢复和备份
RDB缺点: 没办法秒级持久化,老版本兼容会有问题
AOF优点:数据一致性和完整性更高
AOF缺点:内容越多,文件越大,恢复越慢 - 如何预防缓存雪崩,穿透,击穿?
缓存雪崩:
概念: 相同的缓存时间同时过期,大量请求落到DB
方法:缓存过期时间加上随机偏差,分布式缓存防止单点故障
缓存穿透:
概念: 不存在的数据被大量请求了,或者恶意请求了
方法: 缓存占位符。比较短的过期时间比如一分钟。
缓存击穿:
概念: 热点数据过期且有大量的并发请求
方法: 唯一的DB请求,共享结果。分布式锁。 - redis的主从复制过程?
redis 2.8以后RDB会采取增量复制的方法,判断发送的runID(redis进程唯一ID)和offset数据编译量进行比较,偏移量还没有进行覆盖会进行增量复制。否则数据不一致则会进行全量复制。Replication Buffer设置太小也会触发全量复制。 - 缓存的更新策略?
1.添加和删除时,先修改缓存再更新DB。先修改DB读取数据可能不一致
2.删除时,先删除DB再删除缓存,否则可能拿到DB的旧数据。保证数据的一致性,最好使用“延时双删”方法,睡眠一点时间,第二次删除缓存。 - redis的集群有几种模式?
网络
- tcp握手和挥手过程?
- 如何解决tcp粘包和粘包问题?
- 访问一个网页的过程?
- http1.0,1.1,2.0, 3.0的区别?
HTTP/1.0
1.默认使用短连接,每次请求都需要建立一个TCP连接。它可以设置Connection: keep-alive这个字段,强制开启长连接。
HTTP/1.1
1.引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用。
2.分块传输编码,即服务端没产生一块数据,就发送一块,用”流模式”取代”缓存模式”。
3.管道机制,即在同一个TCP连接里面,客户端可以同时发送多个请求。
HTTP/2.0
1.二进制协议,1.1版本的头信息是文本(ASCII编码),数据体可以是文本或者二进制;2.0中,头信息和数据体都是二进制。
2.完全多路复用,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。
3.报头压缩,HTTP协议不带有状态,每次请求都必须附上所有信息。Http/2.0引入了头信息压缩机制,使用gzip或compress压缩后再发送。
4.服务端推送,允许服务器未经请求,主动向客户端发送资源。
HTTP/3.0
1.弃用了TCP协议,基于UDP协议改用QUIC协议实现。减少了TCP握手过程。
2.解决了HTTP/2中存在的队头阻塞问题,由于HTTP/2在单个TCP连接上使用了多路复用,受到TCP拥塞控制的影响,少量的丢包就可能导致整个TCP连接上的所有流被阻塞。 - tcp包和udp包的结构有什么不同? (星云开物)
golang
- defer 执行顺序?
- 无缓存channel和有缓存channel区别?
- GMP模型,为什么goroutine开销小?
- AOP和IOC应用? (星云开物)
gin
Example:
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
GFS
- 怎么支持快速的顺序读和追加写?
总体使用三写一读模式。写入采用流水线技术和数据流与控制流分离技术保证性能;追加对一致性保证更简单,也更高效。读则所有副本都可读,就近读取情况性能更高。
分布式
- CAP理论
概念:
AP不能同时的问题: - BASE理论
Nodejs
- Nodejs如何内存调优?
开发期间使用loadtest压测,再使用node-heapdump抓取堆内存快照,使用chorme的profiles开发工具导入快照进行排查