面试问题

209 阅读5分钟

基础知识

  • 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理论
    概念:
    image.png AP不能同时的问题: image.png
  • BASE理论

Nodejs

  • Nodejs如何内存调优?
    开发期间使用loadtest压测,再使用node-heapdump抓取堆内存快照,使用chorme的profiles开发工具导入快照进行排查