既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
16.场景: 制作登录系统, 允许手机端, pc端, 平板端多端登录, 一旦有一端修改密码, 其它端登陆态失效, 如何设计?
17.给定一个整数数组, 判断该数组是否有序(注意: 升序或者降序都判断为有序)
卓易科技
1.介绍一下gin中的中间件? (如何自定义一个中间件)
2.gin的拦截器有c.next放行的方法, 那么它是如何做到执行完毕链路方法之后, 又返回到当前拦截器位置的呢?
c.next() c.abort()
gin的中间件实际上还是gin.HandlerFunc, 和其它处理器是一样的
执行完next之后, 又返回当前中间件的特性, 依赖go语言的闭包和函数运行栈实现.
执行next放行后, 将当前函数入栈, 直到遇到c.Abort()返回, 然后根据原来的链路反向执行回去, 而且闭包允许引用函数外的变量和函数,返回时可以直接正常运行
3.切片的扩容机制?
4.内存对齐?
内存对齐是计算机硬件对内存数据访问的一个优化手段。当数据在内存中的地址是某个固定大小的整数倍时,处理器访问该数据的速度会更快。
这种优化可以减少处理器访问内存的次数,提高程序的运行效率。例如,一个int32类型的变量在32位处理器上通常需要对齐到4字节的边界,而在64位处理器上可能需要对齐到8字节的边界。如果不对齐,处理器在访问这些数据时可能需要进行额外的内存操作,这会影响程序的性能。
5.索引? 回表查询?
6.mysql中的数据是如何加载到内存中的, 如何写入到磁盘中的?
7.开启了事务, 刚执行完插入, mysql宕机, 如何保证的这条数据不插入成功
8.redis是怎么使用的? redis的订阅和发布?
9.http状态码: 1开头的
10.get和post的区别? (网络层面)
11.给定两个数组, 求两个数组的交集
12.数组长度为30亿, 最小数字为1, 最大数字为35亿, 判定给定的数字是否出现在数组中
广州山海娱乐
1.假设有一台本地及其,无法做加减乘除运算, 我们提供了一个服务器端的Http API, 可以串两个数字类型的参数, 响应结果是这两个参数的和, 请写一个高效的函数, 调用远程方法, 计算出结果
2.redis常用的类型? 以及使用用途
3.场景: 基于redis实现限流, 每分钟限定用户只能访问100次, 如何实现?
使用sort set, 分数设置为访问时间, 访问时间-60秒, 判断有多少个请求, 如果大于100, 则不允许请求
4.mysql失效场景?
mysql自动评测,如果数据量小, 不走索引, 当使用order by时, 如果发现走索引的效率比较慢, 也会舍弃索引
5.索引优化做过哪些优化?
6.最左前缀法则的原理是什么?
7.id, name两个字段, where name like %abc%, 有1000万数据, 怎么进行优化?
先根据name查询id, 再根据id查询出所需要的字段
8.prometheus怎么使用的? 存储类型是什么?
9.kafka如何保证的消息有序?
10.有并发场景吗?
11.讲一下整个服务的组件链路
贝联珠贯
1.waitGroup, 如果有一个协程卡死了, 不返回context处理, 定义超时时间, 和公共状态, 如果出错了, 协程中使用context处理超时, 并且讲公共装填设置为true
2.你们的流量表数据量有多大?
3.抓取一次接口数据要响应时间要多久?
4.缓存?
5.输出100个100以内加减法
小白羽
1.每天的线索量有多少?
2.GMP模型
3.Innodb的ACID是如何保证的?
4.微博热搜功能如何实现? 小顶堆+redis排序
5.给定a,b两个字符串, 判断字符串b是否为字符串a的子串
前海汇流
1.http和https的区别?
2.https用的是对称加密还是非对称加密?
3.b+树索引结构的特点? 底层的叶子节点起到的作用是什么?
4.聚簇索引和非聚簇索引的区别?
贝联珠贯
1.表中数据量有多大?
2.哪些适合内存存储? 哪些适合mysql查询?
3.索引优化?
4.开发使用的是什么框架? 如果要实现接口鉴权效果, 怎么实现?
5.了解规则引擎吗? 如果自己设计状态机, 如何设计?
6.场景题: 一个日志文件, 有100万行, 其中每一行可能出现重复的日志, 请找出前50条重复次数最多的日志
7.小顶堆排序的时间复杂度是多少?
8.有使用过channel吗
9.sql执行慢的原因? 如何排查?
- 查看是否建立了索引, 索引是否生效。解决方案: explain查看索引命中情况,以及查询时间
- 单表数据量过多,导致查询瓶颈。解决方案:水平分表,垂直分表,分库: 例如已经拆分万1000张表,将0-100放到同一数据库实例中,将100-200放到另外一个数据库实例中,依此类推把1000张表存放到10个数据库实例中。 这样根据业务主键将请求路由到不同的数据库实例, 从而让每个数据库实例的流量比较小, 达到提高数据库性能的目的。
- 网络原因导致机器负载过高,可以部署一主多从的mysql集群,提高mysql的查询处理性能
- 热点数据导致单点负载不均衡。
10.进程与线程的区别:
- 本质区别:进程是操作系统分配资源的最小单位,线程是处理器任务调度的最小单位
- 包含关系:一个进程至少有一个线程,线程是进程的一部分
- 资源开销:同一进程内的线程共享进程的地址空间,每个线程都有自己独立的运行栈和程序计数器,线程间切换的开销小
4.影响关系:一个进程崩溃后,其它进程不受影响。 一个线程崩溃,可能导致所属进程被系统杀掉
11.slice的扩容机制:
go1.18版本后, 扩容使用threshold为临界点(源码中设置为256)
当slice容量 < 256时, 每次扩容为原来的两倍。当slice容量 > 256时, 每次增加(oldcap + 3*threshold) 3/4
12.tcp和udp的区别?
- 连接: tcp需要建立连接 udp不需建立连接
- 服务对象: tcp是一对一, udp可一对一, 一对多
- 可靠性: tcp可靠, 有序, udp不可靠, 无序
- 拥塞控制,流量控制: tcp拥有拥塞控制和流量控制, 保证数据传输的安全性, udp即使网络非常拥堵, 也不影响udp的发送速率
- 传输方式: tcp为流式传输, 没有边界, 但保证顺序和可靠, udp是一个包一个包发送, 有边界, 但是可能丢包或乱序
- 首部开销: tcp的首部开销大, udp的首部只有固定的8字节,开销小
13.restful请求?
get: 表示读取服务器上的资源
post: 表示在服务器上创建资源
put: 表示更新或者替换服务器上的资源
delete: 表示删除服务器上的资源
patch: 表示更新/修改资源的一部分
14.restFul请求和http请求的区别?
http 是一种应用层协议, 它定义乐客户端如何与服务器进行通信, 包括请求和响应的格式.
restFul是一种软件架构风格, 依赖于http协议来实现, 然后根据对资源的不同操作类型, 划分为不同的restful请求
15.什么是grpc? protobuf/json区别与优势?
- grpc是远程调用框架,基于http2.0实现,允许在计算机之间进行跨语言,跨平台通信,使得构建分布式系统更加简介高效
- grpc使用protocol buffer作为默认序列化机制,比json更加高效
哔哩哔哩
算法1: 顺时针旋转矩阵
算法2: 合并区间
字节跳动
1.介绍一下业务表的字段
2.定时任务刷新字段, 是怎么实现的?
3.分布式锁? 分布式死锁如何解决? 看门狗机制? 如何避免当前线程加的锁, 被其它线程解锁?
4.乐观锁和悲观锁的区别? 写多读少的情况, 应该使用乐观锁还是悲观锁?
5.分布式场景下, 如何实现乐观锁?
6.kafka的幂等性? 如何避免消息被重复消费?
7.两个线程, 同时向mysql中插入一条数据?
8.kafka如何保证消息不丢失
9.sql优化场景:
select id,name,balance from account where update_time > '2020-09-19' limit 100000, 10
该语句为什么查询慢? 有什么优化思路?
- 算法题: 子集
客路航运
1.http和gRpc的区别?
2.mysql,redis,mongoDB,ES 说说如何根据使用场景,选择对应的存储组件?
3.线上的接口性能差, 如何排查和提高?
4.redis常见的数据结构?
5.找出链表的倒数第N个节点。如何判断链表有环?
6.分库分表如何设计?
场景: 例如本订单表是按照id进行的分表, 但是有的查询, 需要根据id进行查询, 有的查询需要根据活动id查询, 如何实现这个分表方案?
- 按照id进行分表 再按照活动id进行分一次表
- 如果事务要求不高, 可以将活动的数据同步到ES, 使用es进行相关查询
- protobuf相较于json的优势?
- 效率高:protobuf使用二进制编码,编码解码速度更高,体积更小
- 可读性: 虽然protobuf是二进制格式,但是其定义文件是可读的,大型数据结构情况下,更加易于维护和理解
- 跨语言支持:protobuf支持多种编程语言
8.redis中的数据类型?底层结构?
redis list的逻辑类似双向链表,每个节点有next,prev两个指针,和一个value指针真正存储值,如果单纯使用双端链表,会出现问题
- 如果每个node节点中,value指针指向的数据很小,比如只存储了一个int值,那么prev,next指针占据的Node节点的绝大部分的空间,真正存储数据的有效负载就很低,链表节点出现很多的话,就会出现很多不连续的内存碎片
- 链表查询时,需要沿着链表顺序进行查询,所以双端链表的查找效率低
redis7.0前的版本为解决上述问题,实现了quickList的结构,将Node节点的value指针,指向一个ziplist实例,ziplist是一块连续的空间,可以存储多个list的元素,这样quickList与普通链表相比,Node节点数量会更少,内存碎片也更少,而且一个Node中存放了多个元素,prev,next指针占据的空间比例很少,有效负载变得很高
ziplist虽然是一块连续空间,但是不能像数据一样进行随机访问,查找元素的时候同样需要从头开始扫描,但是ziplist是一块连续空间,就不会像Node查找一样有很多指针解析的开销,数据量少时,迭代一遍的效率比较快
9.渐进式rehash?
在resis使用过程中,当哈希表已经到达容量上限,redis通过rehash进行rehash进行扩缩容。但是,redis执行命令时单线程模型,对当前哈希表进行rehash时,一次rehash操作可能导致服务器出现阻塞并停止对外服务。为解决该问题,使用渐进式rehash方案,就是将rehash分为多次完成。在redis中,字典数据结构底层使用两个全局哈希表实现,为方便理解称之为哈希表1和哈希表2。另外,字典还维护一个rehashIdx字段,来记录rehash操作的下标位置,初始值为-1,代表未进行rehash操作
渐进式rehash的详细步骤:
- 首先为哈希表2分配空间,默认长度时哈希表1长度的2倍
- 设置索引计数器变量rehashInx为0, 表示rehash工作正式开始
- 在rehash进行期间,每次对字典执行增删改查操作时,除了执行指定的操作以外,还会把哈希表1在当前rehashInx索引上的所有键值对rehash到哈希表2。 当rehash操作完成之后 rehashInx属性的值就会+1
- 随着字典增删改查操作的不断执行,最终所有键值对都会被rehash到哈希表2中。rehash操作完成之后,哈希表1table数组的指针指向哈希表2 table数组的指针, 哈希表2 table数组的指针指向 null, 并将 rehashIdx 属性的值设置为-1, rehash操作完成
注意:
- 在渐进式rehash进行期间,字典的删除,查找,更新等操作,会在两个哈希表上运行
- 在渐进式rehash执行期间,字典的添加操作权在 哈希表2 上进行
- rehash后新的下标为N或者N+size,N+为原下标,size为原数组大小
10.分库分表:如果分表策略, 不能满足查询条件要求, 怎么处理?
方案1: 按照多个查询条件, 拆分为多个冗余表。方案2: 例如按照id拆的,那么正常拆,正常拆,不重要的查询字段, 将数据同步到es中, 走es查询
富途
1.kafka如何做的容灾?
2.kafka的性能为什么高?
3.用户态和内核态?
4.mysql的容灾如何做的?
5.mysql从库的同步模式?
- 异步复制: 默认为异步同步. 主库提交事务后, 立即返回给客户端, 不关心从库是否已经接收并处理.问题: 如果主库宕机, 由于主库数据没有同步到从库, 可能导致数据丢失
- 全同步复制: 主库执行完事务, 必须等到所有从库执行同库完毕, 才算事务执行成功
- 半同步复制: 主库至少需要等待一个从库接收并写入RelayLog文件即可.
6.数据库的事务隔离级别是什么? 遇到过幻读吗? 如何解决幻读?
幻读: 当前事务查询不到对应数据, 但是插入该数据插入不进去
7.mysql中有哪些锁?
行级锁, 表级锁
8.go如何启动一个协程?
9.协程和线程的区别?
10.进程和线程的区别?
11.有线程为什么还需要协程? 主要是对线程的哪个问题进行了优化?
12.linux的硬链接和软连接?
13.go的内存逃逸?
14.interface一般都是怎么使用的?
15.https如何保证的安全?
16.https连接的密钥流程?
公钥是公开的, 私钥是服务端私有的, 客户端先发送请求,服务端接收请求后, 服务端根据公钥对 响应回公钥
17.time_wait是解决什么问题的?
18.算法: 最长回文子串?
360
1.协程池的作用?
2.内存逃逸分析?
3.go的内存回收什么条件会触发? go的GC能够手动触发吗?
4.channel的底层实现? 有缓冲的,无缓冲的channel, 如果管道已经关闭了, 读取会不会发生错误?
5.切片使用的时候需要注意什么?
6.go中的参数传递是值传递还是引用传递?
7.defer的执行顺序?
8.100G的文件, 统计出所有英文字母, 按照字母表顺序输出
9.linux如何分割文件?
10.接口性能如何优化?
11.什么情况会全表扫描?
12.主丛同步的原理? mysql还有什么相关的log文件?
13.分布式锁的原理?
乐信
1.项目中用到哪些设计模式?
2.promethus如何使用的?
3.协程池自己实现的还是第三方包? 协程池的功能有哪些? sync.Pool的回收机制
4.如何获取进程中运行的协程数量?
5.遇到的线上故障有哪些?
6.线上go程序占用内存是多少?
7.接口优化思路?
8.线上每张表的数据量有多大?
9.如何提升数据库层面的性能
10.ES如何使用的? 倒排索引的原理是什么?
11.自己实现过哪些数据结构?
12.用户10分钟内, 如何只看到同一条广告
13.go语言和java语言的差异点
14.GC回收原理
15.项目中的难点
16.go应用突然挂了, 都有哪些原因? 如何排查?
17.recover能够捕捉到子协程的错误吗?
酷狗音乐
1.mysql存储引擎?
2.mysql隔离级别? 分别解决了什么问题?
3.2pc, 3pc 算法
4.10亿个数据获取前100个最大数据?
5.单个表到达多大要进行拆分? 为什么需要拆表?
6.redis哪些使用场景?
7.服务的熔断降级?
8.平时如何提升和学习?
9.TCP和UDP可以绑定同一个端口吗?
10.linux如何查看cpu, 内存负载?
11.进程间通信有哪些方式?
12.redis的数据类型?
13.redis和mysql的一致性问题?
AfterShip
1.最熟悉,最有收获的项目
2.协程池使用的第三方包还是自己实现的?
3.GMP中, P的数量大小默认是多少? P的数量是固定死的还是可以手动调整的?
cpu核心数. 可以通过设置环境变量 GOMAXPROCS来调整P的数量
4.kafka的一致性? kafka默认的ack级别?
一致性: 可靠性, 幂等性, 有序性.默认ack级别为1
5.kafka挂了, 如何保证异步消息不丢失?
- 设置ack级别为-1, 所有副本都收到才算成功写入
- 设置重试次数, 发送失败可以重试
- 开启幂等性, 确保重试也不会产生重复的消息
- 将消息写入mysql数据库, 然后再异步发送到kafka
6.kafka事务消息?
指生产者向kafka发送消息时, 要么全部发送成功, 要么全部发送失败并回滚.
确保了消息的一致性,原子性操作和精准一次消费.
生产者产生一条事务消息, 获取一个事务id, 发送事务消息时, 是同步发送的, 保证消息一定顺利写入broker
如果发送的是异步消息, 对于生产者来说, 发送后即显示发送成功, 但是下游broker的ack级别如果是-1, 那么只有该消息全部副本同步成功, 才算发送成功,所以异步消息还是会受ack级别影响.
7.口述堆排序的原理?
8.聊天系统如何直到客户是否在线? 用户聊天使用的是长连接还是短连接?使用websocket连接, 还需要自己实现心跳保活吗?
不需要, websocket自己已经实现了心跳保活机制, 只需要设置pingInterval和pingTimeout即可
百度
1.GMP模型?
2.协程创建后如何调度?
先进入p的私有队列, 如果满了, 进入全局队列
3.context的结构和用法
4.一次url的请求过程?
5.请求到达项目服务器后的调用链路
6.nginx是否为单例的.
7.算法: 两数相除
8.平时mysql优化的案例?
9.in, exist的使用
10.联合索引
11.binlog日志
12.分布式事务: 下游两个db使用redis, 需要更新这两个不同的db, 如何自己实现最终一致性
13.两阶段提交, 三阶段提交?
欢乐互娱
1.slice和array的区别?
2.map是否并发安全?
3.channel相关? 如果没有初始化, 可以写吗? 可以读吗?已经关闭了, 再写?
4.如果是无缓冲类型管道? 读取和有缓冲的区别?
5.select监听多个管道
6.10个goroutine想要顺序执行, 如何实现?
7.10个协程同时执行, 如果其中有一个协程产生了错误, 其它协程停止运行, 如何实现?
8.如果controller方法中启动了一个go协程, 如何保证该协程和方法的生命周期一致?
9.接口性能优化?
10.分库分表? 水平分表, 垂直分表
11.项目中技术难点?
12.kafka重复消息问题?
13.ES如何使用的? ES的延迟?
14.一个服务已经跪了, 但是其它服务依赖该服务,如何在编码层面处理?
15.nginx具体的处理过哪些问题?
16.端口有大量的time_wait如何解决?
- 减少time_wait的等待时间
- 检查连接池是否够用
17.场景题: 兑换码永久有效, 海量玩家同时进行兑换, 如何设计?
缓存, 布隆过滤器.
18.算法题: 函数只能胜场1-5的函数, 请实现生成1-7的函数
回响科技
1.服务注册和发现?
2.grpc的序列化和反序列化协议?
3.设置分布式锁的命令? setnx
4.redis的事务? redis执行lua脚本, 为什么lua脚本能够保证原子性执行?
redis是单线程的, 会把当前脚本执行完后再执行其它命令
5.redis的持久化方式? AOF在持久化时的优化策略?
当文件超过某个阈值时, 保存当前文件的快照, 旧的AOF文件就舍弃不用了, 因为只需要记录数据最新的状态即可
6.sort set的底层实现?
7.kafka的结构? ack默认级别?
8.有序性如何保证?
9.用户表? 字段为性别, 1和2 适合建立索引吗? 建立索引反而导致查询变慢的原因?
10.最左前缀法则?
11.订单列表, 越往后翻越慢, 原因是什么? 如何进行优化?
12.es用过吗?
13.订单定时关闭? 延迟队列?
rocketmq, kafka本身没有实现延迟消息队列的功能.
kafka:
常见的实现方式可以使用主题分区和时间戳, 可以创建一个专门用于延时消息的主题, 该主题创建多个分区, 将要延时发送的消息发送到该主题, 设置消息的期望执行时间. 消费者订阅该主题, 按照时间顺序消费消息, 判断当前时间是否到达了消息设定的执行时间, 如果达到则执行相应的操作, 否则将该消息重新发送到延迟队列rabbitmq:ttl+死信队列实现延迟队列, 可以给指定队列或者消息设置ttl过期时间, 一旦到达过期时间, 那么会称为死信, 可以发送到指定的死信队列
14.时间轮算法?
15.多协程编排? waitGroup的实现?
16.单例模式
17.层序遍历二叉树
好未来
1.为什么要自己实现大顶堆? 大顶堆和小顶堆的使用场景?
2.如何利用堆, 获取第k大的元素? 堆如何删除某一个特定的节点? 大顶堆如何转换为一个小顶堆?
3.引入mq, 实现异步提速, 如何理解?
4.协程池使用的是第三方包吗? 如果自己实现一个协程池, 描述你的思路?
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
反而导致查询变慢的原因?
10.最左前缀法则?
11.订单列表, 越往后翻越慢, 原因是什么? 如何进行优化?
12.es用过吗?
13.订单定时关闭? 延迟队列?
rocketmq, kafka本身没有实现延迟消息队列的功能.
kafka:
常见的实现方式可以使用主题分区和时间戳, 可以创建一个专门用于延时消息的主题, 该主题创建多个分区, 将要延时发送的消息发送到该主题, 设置消息的期望执行时间. 消费者订阅该主题, 按照时间顺序消费消息, 判断当前时间是否到达了消息设定的执行时间, 如果达到则执行相应的操作, 否则将该消息重新发送到延迟队列rabbitmq:ttl+死信队列实现延迟队列, 可以给指定队列或者消息设置ttl过期时间, 一旦到达过期时间, 那么会称为死信, 可以发送到指定的死信队列
14.时间轮算法?
15.多协程编排? waitGroup的实现?
16.单例模式
17.层序遍历二叉树
好未来
1.为什么要自己实现大顶堆? 大顶堆和小顶堆的使用场景?
2.如何利用堆, 获取第k大的元素? 堆如何删除某一个特定的节点? 大顶堆如何转换为一个小顶堆?
3.引入mq, 实现异步提速, 如何理解?
4.协程池使用的是第三方包吗? 如果自己实现一个协程池, 描述你的思路?
[外链图片转存中…(img-eYTCr3g9-1715552575319)]
[外链图片转存中…(img-pZyzc4qI-1715552575320)]
[外链图片转存中…(img-YNfmuTVM-1715552575320)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新