假期结束秋招喜来,瞧瞧节后字节跳动的面经
文末有面经共享群
💼岗位职责:
负责后端服务的开发与维护;
技术预研和技术难点攻关,保障系统可用性、稳定性、和可扩展性;
持续优化系统架构设计,提出问题解决方案。
📋任职要求:
计算机或相关专业,全日制本科以上学历;
有扎实的 GO 语言基础,对数据结构和算法设计具有深刻的理解,熟悉至少一种脚本语言(shell/python/perl);
2 年以上 Linux/Unix 服务端开发经验,熟悉 TCP/IP 协议,掌握 Linux 下高性能网络服务器编程,如异步通信、事件驱动,性能优化等;
熟悉 SQL,并了解常用的 SQL 优化技巧;熟悉 MySQL/Postgresql,并掌握常用性能优化技巧。
✨面试问题回顾:
1. 自我介绍
在自我介绍中,面试者可以重点介绍自己的教育背景、工作经验、技术技能和项目经历。
2. 说一下项目的业务,怎么做的,难点在哪,如何解决?
在消息队列中遇到的数据倾斜问题、数据不丢和重复消费问题;在 Redis 中使用 hash 以及 Pipline、bigkey 拆解问题;在数据库中进行性能优化和分库分表问题等。在难点的阐述可以展示自己在面对复杂问题时的分析和解决能力。对于难点的解决方案,可以详细说明自己采取的技术手段和思路。
3. 面试官问,重复消费 set 一直增大怎么办?
例如,对于重复消费问题,可以使用时间保存不同的 set 然后设置失效时间,或者再套一层布隆过滤器。
4. InnoDB 事务隔离级别,遇到的问题,怎么解决?
InnoDB 支持四种事务隔离级别:读未提交、读已提交、可重复读和串行化。读未提交会导致脏读问题,读已提交可以避免脏读但可能出现不可重复读问题,可重复读可以避免脏读和不可重复读但可能出现幻读问题,串行化可以避免所有问题但性能较低。
对于事务隔离级别带来的问题,可以采用 MVCC(多版本并发控制)、加锁或业务代码解决等方法。
5. InnoDB 有哪些锁?
InnoDB 支持数据库锁、表锁和行锁。
6. Redis key 过期策略
Redis 支持惰性删除、定期删除和定时删除三种 key 过期策略。
惰性删除是在访问 key 时检查其是否过期,如果过期则删除。这种策略可以节省系统资源,但可能会导致过期 key 长时间占用内存。
定期删除是定期检查一定数量的 key,如果发现过期则删除。这种策略可以及时清理过期 key,但可能会消耗一定的系统资源。
7. Redis string 底层数据结构
Redis string 的底层数据结构根据字符串的长度不同而有所不同,在底层使用了简单动态字符串(Simple Dynamic String, SDS)作为其数据结构。当字符串长度小于 44 时,使用连续内存的 object 存储;当字符串长度大于 44 时,分两次使用 object 存储,可以提高数据存储效率。
8. go 的 channel 怎么实现
Go 的 channel 是一种用于在 goroutine 之间进行通信的机制。它通过队列实现了数据的发送和接收,可以实现同步和异步的通信方式。
Channel 字段解释
qcount: 当前队列中的元素个数。
dataqsiz: 环形队列的大小。
buf: 指向环形队列的指针,用于存储实际的数据。
elemsize: 元素的大小。
closed: 标记 channel 是否关闭。
elemtype: 元素的类型信息。
sendx: 发送索引,指向当前发送位置。
recvx: 接收索引,指向当前接收位置。
recvq: 等待接收的 goroutine 队列。
sendq: 等待发送的 goroutine 队列。
lock: 互斥锁,保护
hchan
结构。
9. 浏览器输入 https://www.baidu.com 从网络的角度说一下流程
当浏览器输入 https://www.baidu.com 时,首先会进行 DNS 解析,查找域名对应的 IP 地址。浏览器会先检查本地缓存,如果没有找到,则会向网络上的 DNS 服务器发送请求。
找到 IP 地址后,浏览器会与服务器建立 TCP 连接,进行三次握手。如果是 HTTPS 协议,还会进行 TLS 加密,先进行非对称加密交换密钥,然后再进行对称加密进行数据传输。
服务器接收到请求后,会返回 CSS、JS、HTML 等文件,浏览器解析这些文件并显示页面。
10. Go 逃逸分析
Go 的逃逸分析是一种编译器技术,用于确定变量的存储位置。通过逃逸分析,编译器可以决定变量是分配在栈上还是堆上。
变量类型不确定:当变量的类型在编译期间无法确定时,编译器可能会将该变量分配在堆上而不是栈上。
有全局变量引用:
如果一个局部变量被全局变量引用,那么这个局部变量可能会逃逸到堆上。
给 slice 分配的长度太大:
如果给 slice 分配的长度非常大,可能会导致栈空间不足,从而使 slice 逃逸到堆上。
给 slice 分配的长度不定:
如果 slice 的长度在运行时才能确定,那么编译器可能会将其分配在堆上。
11. Sync 包有哪些东西
1. sync.Mutex(互斥锁):
用途:用于保护共享资源,确保在同一时间只有一个 goroutine 可以访问被保护的资源。
工作原理:当一个 goroutine 获得互斥锁后,其他 goroutine 试图获取该锁时会被阻塞,直到持有锁的 goroutine 释放锁。
2. sync.RWMutex(读写互斥锁):
用途:适用于读多写少的场景,允许多个 goroutine 同时读取共享资源,但在写操作时需要独占访问。
工作原理:分为读锁和写锁。多个 goroutine 可以同时获取读锁进行读取操作,但当有一个 goroutine 获取写锁时,其他 goroutine 无论是读锁还是写锁都将被阻塞,直到写锁被释放。
3. sync.Map:
用途:提供了一种并发安全的 map 类型,无需使用传统的互斥锁来保护对 map 的读写操作。
工作原理:内部使用了一些复杂的技术来实现并发安全,例如原子操作和分段锁等。可以同时支持多个 goroutine 进行读写操作,而无需显式地加锁。
4. sync.Once:
用途:确保一个函数在程序运行期间只被执行一次。
工作原理:内部使用了一个原子变量和互斥锁来保证只执行一次。当多个 goroutine 同时调用包含
sync.Once
的函数时,只有第一个调用会执行函数体,其他调用会被阻塞直到第一次调用完成。
5. sync.Pool:
用途:提供了一种对象池的机制,可以重复利用已经创建的对象,减少对象的创建和销毁开销。
工作原理:当一个 goroutine 需要一个对象时,可以从对象池中获取一个可用的对象。如果对象池中没有可用的对象,会创建一个新的对象。当一个 goroutine 不再需要一个对象时,可以将其放回对象池中,以便其他 goroutine 可以复用。
12. 职业规划
13. 期望薪资
14. 反问
公司业务
工作时间
欢迎关注 ❤
我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。
没准能让你能刷到自己意向公司的最新面试题呢。
感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:【infoQ】。
版权声明: 本文为 InfoQ 作者【王中阳Go】的原创文章。
原文链接:【http://xie.infoq.cn/article/03056421381a1ca563dcbccc8】。文章转载请联系作者。
评论