首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >冲进腾讯!太不容易了

冲进腾讯!太不容易了

作者头像
王中阳AI编程
发布2026-03-17 18:41:01
发布2026-03-17 18:41:01
760
举报
文章被收录于专栏:Go语言学习专栏Go语言学习专栏

新的一周,继续加油!

先来唠唠

今天给大家分享一份腾讯Go后端的面经,先来说说这位同学的面试经历,正在找工作的同学可以参考一下。

他第一次面腾讯,过了前两面,到第三面没通过。之后他去面了某打车软件,拿到了 offer,本来都快入职了,结果被毁约了

本以为大厂无望了,但是腾讯的HR突然联系他,说看了他之前的面试记录,问他要不要再试一次。

面试官觉得他技术还行,就是经验少了点,刚好部门有新的招聘名额,就想着再给他个机会。

有了之前的经验,这次他做足了准备,从一面到终面都挺顺利,最后HR跟他谈了薪资。

这一路走来真的是不容易,好在他一直没有放弃。下面就分享下他在腾讯的一面面经

面经详解

1. 主键索引和普通索引有什么区别?

主键索引是一种特殊的唯一索引,用于唯一标识表中的每一行数据。它具有以下特点:

  • 聚簇索引:主键索引的叶子节点直接存储数据行,因此数据物理上按主键顺序存储。
  • 唯一性:主键索引要求所有值唯一且非空。
  • 性能:通过主键查询数据的速度极快,因为直接定位到数据行。

普通索引则是非聚簇索引,其叶子节点存储的是索引列的值和对应的主键值。普通索引允许重复值,且不强制非空。查询时需先通过索引找到主键,再回表查询完整数据行,因此可能需要两次I/O操作。

2. 为什么非聚簇索引要回表?

非聚簇索引(如普通索引)的叶子节点仅存储索引列的值和主键,不包含完整数据行。当查询需要访问索引列以外的字段时,需先通过非聚簇索引找到主键,再根据主键到聚簇索引(主键索引)中查找完整数据行。这种二次查询的过程称为“回表”。例如,若表有索引idx_name,查询SELECT * FROM users WHERE name='Alice'时,需先通过idx_name找到主键,再通过主键查询完整数据。

3. MySQL隔离级别?

MySQL支持四种事务隔离级别,默认是可重复读(Repeatable Read)

  1. 读未提交(Read Uncommitted):最低级别,允许事务读取其他事务未提交的数据(脏读)。
  2. 读已提交(Read Committed):事务只能读取已提交的数据,避免脏读,但可能出现不可重复读。
  3. 可重复读(Repeatable Read):事务在执行期间,多次读取同一数据的结果一致,通过MVCC(多版本并发控制)避免不可重复读和幻读。
  4. 串行化(Serializable):最高级别,事务串行执行,完全避免并发问题,但性能较低。

4. MySQL主从同步原理?

MySQL主从同步基于二进制日志(binlog),分为三个阶段:

  1. 主库记录日志:主库执行写操作时,将变更记录到binlog。
  2. 从库获取日志:从库的I/O线程连接主库,读取binlog并写入本地中继日志(relay log)。
  3. 从库回放日志:从库的SQL线程读取中继日志,按顺序执行SQL语句,使从库数据与主库保持一致。 主从同步支持三种复制模式:基于语句(Statement)、基于行(Row)、混合模式(Mixed),默认使用Row模式以确保数据一致性。

5. binlog日志存的是什么?

binlog(二进制日志)记录了所有对数据库数据和结构的变更操作,包括:

  • DML语句:如INSERT、UPDATE、DELETE。
  • DDL语句:如CREATE、ALTER、DROP。
  • 事务相关信息:如事务开始和提交的标记。 binlog用于数据恢复、主从同步和审计。其格式有Statement、Row、Mixed三种,其中Row模式记录每行数据的具体变更,安全性更高。

6. Redis缓存雪崩是个什么概念?怎么解决?

缓存雪崩指大量缓存同时失效,导致请求直接穿透到数据库,引发数据库压力激增甚至崩溃。常见原因包括:

  • 缓存过期时间设置相同,导致集体失效。
  • Redis实例宕机,缓存服务不可用。

解决方案

  1. 分散过期时间:为缓存设置随机过期时间(如基础时间±20%),避免集中失效。
  2. 限流与降级:使用Hystrix等组件限制请求量,或返回默认数据。
  3. 缓存预热:提前加载热点数据到缓存。
  4. 互斥锁重建缓存:缓存失效时,仅允许一个线程重建缓存,其他线程等待。
  5. 高可用方案:部署Redis Sentinel或Cluster集群,避免单点故障。
  6. 布隆过滤器:过滤不存在的Key,减少无效查询。

7. Redis持久化方式?

Redis支持两种持久化方式:

  1. RDB(Redis Database)
    • 原理:将内存数据快照保存到磁盘(默认文件dump.rdb),可手动触发(SAVE/BGSAVE)或按配置自动触发(如save 900 1表示900秒内至少1次写操作则生成快照)。
    • 优缺点:恢复速度快,但可能丢失最后一次快照后的所有数据。
  2. AOF(Append Only File)
    • 原理:将写命令以日志形式追加到文件(默认appendonly.aof),可配置每秒同步(appendfsync everysec)或每次写操作同步。
    • 优缺点:数据更完整,但文件体积大,恢复速度较慢。 建议同时启用RDB和AOF,优先使用AOF恢复数据。

8. HTTP报文格式?

HTTP报文分为请求报文响应报文,结构如下:

请求报文
  1. 请求行方法 URL HTTP版本,如GET /index.html HTTP/1.1
  2. 请求头:键值对形式,如Host: example.com
  3. 空行:分隔头部和正文。
  4. 请求体:POST等方法携带的数据(如表单数据)。
响应报文
  1. 状态行HTTP版本 状态码 原因短语,如HTTP/1.1 200 OK
  2. 响应头:键值对形式,如Content-Type: text/html
  3. 空行:分隔头部和正文。
  4. 响应体:服务器返回的数据(如HTML内容)。

9. HTTP和HTTPS有什么不同?

特性

HTTP

HTTPS

加密

明文传输,不安全

基于SSL/TLS加密,数据保密

端口

默认80

默认443

连接方式

简单请求响应

需TLS握手建立安全连接

证书

需CA颁发的数字证书验证身份

性能

稍慢(加密和解密开销)

HTTPS通过加密和证书验证,防止数据窃听和中间人攻击,适用于金融、登录等敏感场景。

10. TLS握手过程?

TLS握手是客户端与服务器建立安全连接的过程,步骤如下:

  1. 客户端发起请求:客户端发送ClientHello,包含支持的TLS版本、加密算法、随机数等。
  2. 服务器响应:服务器返回ServerHello,选择加密算法、发送证书(含公钥)、随机数。
  3. 客户端验证证书:客户端检查证书有效性(如是否由可信CA颁发)。
  4. 客户端生成预主密钥:客户端生成随机预主密钥,用服务器公钥加密后发送给服务器。
  5. 双方计算会话密钥:客户端和服务器通过预主密钥和随机数生成对称会话密钥。
  6. 加密通信:后续数据通过会话密钥加密传输,确保机密性和完整性。

11. 面向对象三大特性

  1. 封装:将数据和操作数据的方法封装在类中,通过访问控制(如public/private)隐藏内部细节,仅暴露必要接口。
  2. 继承:子类继承父类的属性和方法,实现代码复用。子类可重写父类方法(多态的基础)。
  3. 多态:同一方法在不同子类中表现出不同行为。例如,父类Animalsay()方法,子类DogCat分别实现为“汪汪”和“喵喵”。

12. 进程和线程的区别?

维度

进程

线程

资源分配

独立地址空间、内存、文件句柄

共享进程资源(如内存、文件句柄)

调度单位

操作系统调度的基本单位

进程内的调度单位,切换更快

并发性

多进程可并行(多核)

多线程可并发(单/多核)

上下文切换

开销大

开销小

独立性

进程间数据隔离,通信复杂

线程间数据共享,易引发竞态条件

进程适用于需要资源隔离的场景(如独立服务),线程适用于高并发、低开销的任务(如Web服务器处理请求)。

13. 有没有了解过协程?跟线程的区别是什么?

协程(Coroutine)是用户态的轻量级线程,由编程语言或框架调度,无需操作系统内核介入。与线程的区别:

  1. 调度方式:线程由内核调度(抢占式),协程由用户态调度器控制(协作式)。
  2. 资源消耗:线程需独立栈空间(MB级),协程共享线程栈(KB级),可创建数万个协程。
  3. 切换成本:线程切换需内核介入,协程切换仅保存少量寄存器值,速度更快。
  4. 并发性:线程可并行(多核),协程并发执行(单线程内),适合I/O密集型任务。

14. 为什么说协程更轻量?

  1. 用户态调度:协程切换无需内核参与,避免系统调用开销。
  2. 共享资源:同一线程内的协程共享栈和内存空间,无需额外资源分配。
  3. 更小的栈空间:协程默认栈空间仅数KB(如Go的Goroutine初始栈为2KB),而线程栈通常为MB级。
  4. 创建销毁成本低:协程的创建和销毁仅需简单函数调用,无需内核资源管理。

15. Linux上怎么看机器的负载?

常用命令:

  1. uptime:显示系统运行时间、用户数、1/5/15分钟平均负载。
  2. top:实时监控进程和系统资源,第一行显示负载平均值。
  3. htop:交互式工具,更直观展示负载和进程信息。
  4. dstat:综合显示CPU、内存、磁盘、网络等指标。
  5. vmstat:显示虚拟内存、进程状态、I/O等统计信息。

16. top命令哪些参数表示负载?

top命令的第一行包含系统负载信息,格式为: top - 12:00:01 up 3 days, 4:53, 3 users, load average: 0.11, 0.25, 0.30 其中load average后的三个数值分别表示1分钟、5分钟、15分钟的系统平均负载。数值越高,说明系统压力越大。一般认为,负载值超过CPU核数的70%时需警惕。

17. Linux怎么看cpu的核数?

lscpu:直接显示CPU信息,包括核数、线程数、架构等。

代码语言:javascript
复制
lscpu | grep 'CPU(s)'  
# 输出:CPU(s): 8 (表示8核)  

/proc/cpuinfo:通过文件查询处理器数量。

代码语言:javascript
复制
cat /proc/cpuinfo | grep processor | wc -l  
# 输出处理器总数(如8)  

18. Linux怎么查看当前目录占用了多少空间?

使用du命令:

查看当前目录总大小

代码语言:javascript
复制
du -sh  
# 输出:500M . (当前目录占用500MB)  

查看子目录大小

代码语言:javascript
复制
du -h --max-depth=1  
# 显示当前目录下各子目录的大小  

19. 查看当前服务器建立的tcp连接,用什么命令?

netstat

代码语言:javascript
复制
netstat -tunlp | grep ESTABLISHED  
# 显示所有TCP连接,-t表示TCP,-u表示UDP,-n显示IP地址,-l监听状态,-p显示进程ID  

ss

代码语言:javascript
复制
ss -tun | grep ESTAB  
# 更高效的替代工具,支持过滤和统计  

20. tcp滑动窗口机制是怎么样的?

TCP滑动窗口是流量控制机制,用于避免发送方发送数据过快导致接收方缓冲区溢出。原理如下:

  1. 窗口大小:接收方通过ACK报文告知发送方当前可用的接收窗口大小(win字段)。
  2. 发送窗口动态调整:发送方根据接收窗口大小和拥塞窗口(由网络拥塞情况决定)动态调整发送窗口。
  3. 数据传输:发送方在窗口范围内连续发送数据,无需等待每个ACK。接收方按序接收数据后,窗口向右滑动,允许发送方发送更多数据。
  4. 流量控制:若接收方缓冲区满,窗口大小设为0,发送方停止发送,直到窗口更新。 滑动窗口机制提高了传输效率,同时确保数据不丢失。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 王中阳 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 先来唠唠
  • 面经详解
  • 1. 主键索引和普通索引有什么区别?
  • 2. 为什么非聚簇索引要回表?
  • 3. MySQL隔离级别?
  • 4. MySQL主从同步原理?
  • 5. binlog日志存的是什么?
  • 6. Redis缓存雪崩是个什么概念?怎么解决?
  • 7. Redis持久化方式?
  • 8. HTTP报文格式?
    • 请求报文
    • 响应报文
  • 9. HTTP和HTTPS有什么不同?
  • 10. TLS握手过程?
  • 11. 面向对象三大特性
  • 12. 进程和线程的区别?
  • 13. 有没有了解过协程?跟线程的区别是什么?
  • 14. 为什么说协程更轻量?
  • 15. Linux上怎么看机器的负载?
  • 16. top命令哪些参数表示负载?
  • 17. Linux怎么看cpu的核数?
  • 18. Linux怎么查看当前目录占用了多少空间?
  • 19. 查看当前服务器建立的tcp连接,用什么命令?
  • 20. tcp滑动窗口机制是怎么样的?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档