Go 面试笔记 DB 网络 系统 Go 分布式 算法

这篇博客涵盖了Go语言相关的面试知识点,包括数据库(MySQL、MongoDB、Redis)的索引原理和事务管理,分布式系统中的Raft算法,Go语言的GMP调度器与性能优化,网络协议(HTTP、TCP、UDP)详解,以及操作系统(Linux)的基础知识。此外,还涉及了算法基础和系统设计等内容。
摘要由CSDN通过智能技术生成

1、DB

mysql

为什么索引要使用 B+ 树而不是其它树形结构?

因为 B 树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致 IO 操作变多,查询性能变低。

事务特点,事务底层的实现原理。

原子性(Atomicity),一致性(Consistency),隔离型(Isolation)以及持久性(Durability)

原子性

一个事务中的所有操作要么全部成功提交,要么全部失败回滚,对于一个事务来说不可能只执行其中的部分操作
undo log 回滚日志,记录事务更新前数据

持久性

因为mysql为了性能,是先写入缓存中,然后缓存再读到数据库
一旦机器挂了,缓存的内容也不再了
redo log 重做日志,记录事务更新后数据
使用 redo log,从而达到故障后恢复;

隔离性

并发事务之间互相影响的程度
一个事务执行过程中不应受其它事务影响
读写锁+MVCC

四种隔离级别

一致性

事务在完成时,必须使所有的数据都保持一致状态。
通过回滚,以及恢复,和在并发环境下的隔离做到一致性。

Mongo

索引

explain 模拟索引存在时的搜索性能
简单的说,索引就是将文档按照某个(或某些)字段顺序组织起来,以便能根据该字段高效的查询
B+/-数
单字段索引、复合索引、多key索引(对数组)、文本索引

Redis

五个数据结构

string list hash set zset

集群 高可用

哨兵机制

memCache 对比

key 不能超过 250 个字节;
value 不能超过 1M 字节;
key 的最大失效时间是 30 天;
只支持 K-V 结构,不提供持久化和主从同步功能。

2、分布式

raft算法

leader
follower
candidate

3、Go:

协程改进的路线 从时间的角度

GMP调度器

G:协程
M:线程

GM

创建、销毁、调度G都需要每个M获取锁,这就形成了激烈的锁竞争

M转移G会造成延迟和额外的系统负载

系统调用(CPU在M之间的切换)导致频繁的线程阻塞和取消阻塞操作增加了系统开销
在这里插入图片描述

GMP

在这里插入图片描述

怎么提高Go服务的性能

1、编码优化 json序列化反序列化,占用资源比较多。
把反射工作放到编译的时候去做完,运行时候就不用获取反射信息。
2、GC (垃圾回收机制)瓶颈 优化
1.3版本后,才用标记-清除(mark and sweep)
STW暂停所有正常的代码执行,遍历所有被引用的对象,能遍历到的标记为“被引用”,没有标记过的就进行内存回收。
三色的意义:

1)对象池sync.Pool
提前分配好内存空间,可复用。这样就不用总是频繁去申请内存。
请求体 响应体,比较大的话,
2) 函数尽量不要返回map, slice对象, 这种频繁调用的函数会给gc 带来压力。
3) 小对象要合并。
4) 函数频繁创建的简单的对象,直接返回对象,效果比返回指针效果要好。

理解go-routine、channel概念、用法;

context

在于控制goroutine的生命周期。当一个计算任务被goroutine承接了之后,由于某种原因(超时,或者强制退出)我们希望中止这个goroutine的计算任务,那么就用得到这个Context了。

内存、性能分析(pprof);

如何限制并发的routine数;

掌握接口的用法与设计,提升代码的设计能力;

线程与协程区别

多个协程可由一个或多个线程管理,协程的调度发生在其所在的线程中。

可以被调度,调度策略由应用层代码定义,即可被高度自定义实现。

执行效率高。 因为协程的调度切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。调度发生在应用态而非内核态。

占用内存少。

内存的花销,使用其所在的线程的内存,意味着线程的内存可以供多个协程使用。

其次协程的调度不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,所以执行效率比多线程高很多。

struct 能否比较

  • 同类的对象:
    结论:可比较也不可比较,看成员变量类型
    可比较:Integer,Floating-point,String,Boolean,Complex(复数型),Pointer,Channel,Interface,Array
    不可比较:Slice,Map,Function 编译就报错
  • 不同类的对象:
    结论:可以比较,也不可以比较,可通过强制转换来比较
  • struct可以作为map的key么
    struct必须是可比较的,才能作为key,否则编译时报错

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值