赞
踩
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
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使用二进制编码,编码解码速度更高,体积更小
- 可读性: 虽然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.算法: 最长回文子串?
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的一致性问题?
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.协程池使用的是第三方包吗? 如果自己实现一个协程池, 描述你的思路?
5.recover能捕获到其它协程的panic吗?
6.说一下对grpc的理解? grpc互相调用, 如何实现互相的权限验证和授权?
7.http2.0 的tsl三次握手过程?
8.grpc中, 如果客户端需要向服务端发送大文件, 如何实现? (使用客户端流模式)
9.http2.0的相关特性? 其中的多路复用为了解决什么问题? (解决对头阻塞问题)
10.grpc中的deadLine和timeout, 应该怎么用?
grpc的流控是如何处理的? 滑动窗口控制发送和接收速速率?
11.go-zero中的服务熔断和限流是怎么做的?
12.以下两个代码片段输出的结果:
func test() int { result := 1 defer func() { result++ } return 0 } func test() (result int) { result = 1 defer func() { result++ } return 0 }
1.项目中涉及到哪些监控? prometheus
2.队列出现消息积压, 如何处理?
3.消息幂等性?
4.一个sql语句, 已经建立了索引, 但是突然查询很慢, 如何排查?
5.索引失效场景?
6.mysql如何解决的幻读?
select … for update: 保证当前事务中查询的范围加锁, 不被其它事务修改
7.做索引优化, 如何减少回表次数–索引下推
索引下推: 指将上层(服务层)负责的事情, 交给下层(引擎层)处理.
不使用索引下推: 根据索引中的主键值, 定位并读取完整的行记录, 然后将记录交给server层去检测该记录是否满足where条件
使用索引下推: 获取索引, 判断索引是否符合条件范围, 如果满足, 再进行对应的回表查询获取主键, 如果不满足, 直接过滤掉
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
t {
result := 1
defer func() {
result++
}
return 0
}
func test() (result int) {
result = 1
defer func() {
result++
}
return 0
}
## 酷狗音乐(二面) 1.项目中涉及到哪些监控? prometheus 2.队列出现消息积压, 如何处理? 3.消息幂等性? 4.一个sql语句, 已经建立了索引, 但是突然查询很慢, 如何排查? 5.索引失效场景? 6.mysql如何解决的幻读? > > select … for update: 保证当前事务中查询的范围加锁, 不被其它事务修改 > > > 7.做索引优化, 如何减少回表次数–索引下推 > > 索引下推: 指将上层(服务层)负责的事情, 交给下层(引擎层)处理. > > > 不使用索引下推: 根据索引中的主键值, 定位并读取完整的行记录, 然后将记录交给server层去检测该记录是否满足where条件 > > > 使用索引下推: 获取索引, 判断索引是否符合条件范围, 如果满足, 再进行对应的回表查询获取主键, 如果不满足, 直接过滤掉 > > > [外链图片转存中...(img-sz7fKDCb-1715361952313)] [外链图片转存中...(img-EPpmutam-1715361952313)] [外链图片转存中...(img-SuCYnj1T-1715361952314)] **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!** **由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新** **[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。