底层原理面试汇总

针对原理性的面试题 详细解析 每个知识点都会单独开一篇文章细解 不知道各位同学都能答出来吗 需要交流的话可以单独私信我哦?Q群 606077664

编程思想篇

[x] 请列举下设计模式,并描述下它的场景以及为什么要使用这种模式
[x] PHP的重载如何实现

数据结构篇

  • 为什么MySql要选择B+Tree结构(涉及二叉树,多路平衡二叉树,红黑树)

算法篇

  • 什么是一致性Hash算法
    [x] 描述下漏桶算法原理以及应用场景
    [x] 描述下令牌桶算法原理以及应用场景
    [x] nginx和redis 为什么能支持高并发?(epoll原理描述下)

    网络篇

  • 为什么TCP握手需要三次?
  • 描述下TCP的四次握手过程

数据库篇

  • 主从数据库不一致如何解决?
  • MySql读写分离的原理?
  • mysql事务是什么,如何解决幻读?

    NoSql 篇

  • redis有几种数据类型,适用的场景呢?
    [x] redis怎么保证高可用,高可用模式有那些?对比下优缺点?
    [x] 如何保证redis和mysql数据一致?
    [x] 如何解决缓存击穿问题?

MQ 篇

[x] MQ应用场景、Kafka和rabbit区别?kafka为什么支撑高并发?
[x] es底层读写原理?倒排索引原理?
[x] 工作中如何解决MQ消息堆积和消息重复的问题?

安全篇

[x] 接口如何防重放和被篡改?

Go 面试篇

[x] Go的协程调度机制描述下

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 2个月前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 11

这是面试多少薪资的面试题

2个月前 评论
Krisji (楼主) 2个月前

正在晚上技能中

2个月前 评论
Krisji (楼主) 2个月前
Lionlai 2个月前
Krisji (楼主) 2个月前
hxd 2个月前

没有进程,线程之类的吗?

2个月前 评论
Krisji (楼主) 2个月前

快来答案吧

2个月前 评论
Krisji (楼主) 2个月前

NjA2MDc3NjY0Cg== 这是什么群

2个月前 评论
Krisji (楼主) 2个月前
Krisji (楼主) 2个月前
这辈子不打工

后续呢

1个月前 评论

我来回答一些:

1.MySQL要选择 B+ 树结构

因为 B+ 树将所有数据存储到叶子节点(其他结构会在节点存储值),MySQL叶子节点的上层节点只存储指向下层数据页的指针,可以将更多的上层节点放在内存中。数据页(MySQL的数据是存储在数据页中的,即数据存储在参数 page_size 大小的页中,而且 buffer_pool 里面缓存的也是一页一页的数据)而且每层节点都是一个双向链表结构(方便页分裂与合并),MySQL的数据结构大致如此,但有很多细节还没说明

2.一致性hash算法

一致性哈希算法主要用于解决缓存飘逸,即通过 hash 算法找到缓存key的实例。比如我要存储 a=b 这条数据到 redis 上,现在有 192.168.1.1/2/3 这三台 redis 实例,我先计算 key a 的 hash 值为 23 与实例的数量 3 取模得到 3,那么我就链接 192.168.1.3 这个实例,查找,修改 key a 都在该实例上。这是简单的一致性 hash 的思想实践,很多细节与问题没解决

漏桶和令牌桶算法没听过,或者听到过却不知道。一般的缓存一致性 hash 使用开源代理实现(好像 facebook 开源了的 memcached/redis 代理)。可以基于环形(hash取模查找环上最近实例),或这 redis-cluster 的 slot 来解决

nginx 是多 worker 进程,一个进程就是一个 reactor,进程模型保证稳定,reactor 保证高性能 redis 是单线程 reactor,但 6.0 好像引入了多线程 epoll 需要内核支持,内核根据 fd 的事件来进行通知,不需要轮询和阻塞 worker 线程

TCP 可以握手很多次,但三次就够了,断开才需要 4 次(这题资料很多不多说了,注意一点,如果不第 4 次挥手的话会占用服务端 close_wait 队列)

主从不一致如何解决

查明原因再解决,这题很笼统,不清楚原因盲目解决的话基本事倍功半,比如硬件原因造成的(从库配置差,每秒只能指向 400 个事务,主库每秒要写 300 个事务,但查询占用 300,那无论如何都会延迟),比如主库突然执行了/回滚了一条操作几十万数据的事务,从库突然的延迟(这种延迟从库会赶上,几乎不用处理)。

读写分离原理

主要依靠主从,即主实例写数据,从实例读数据(这题也太笼统,没啥意义),从库获取主库的 binlog,生成中间日志,根据中间日志重放到从库

redis 数据结构

list、string、hash、set、sort set、bit 数组、geo、stream 适用场景因地制宜

redis 保证高可用

主从(读写分离),集群,分片,日志等方面来保证

redis 与 MySQL 数据一致

强一致,加锁保证,即更新数据前获取锁,redis 和 MySQL 都更新成功后在释放锁。 对于一致性实时性不那么高的引入消息队列异步更新

缓存击穿

先讲一讲缓存击穿原理(比如 host/goods/100 代表 id 为 100 的商品,该商品我们缓存到 redis/memcache 中,查询时直接查询缓存,但现在有人掌握了这个规律,直接访问 host/goods/1000000000 这个商品未缓存所以会去查库,库里没有,所以不会写入缓存,所以每次都查库,如果同时这样的请求多了就会拖垮数据库所以就击穿了缓存)黑名单,api 接口限流、空 null 值,系统部分失败等方面解决

kafak 未使用过

es 底层是将索引对象放在堆中,所以 es 占内存,内存越大查的越快

倒排索引即零查整,即分词后查询整体,比如:

"高性能 MySQL 第三版" 分词分为 高、性能、MySQL、第三、版,那么我们查询 “高” 、”性能“ 等分的这些词时,就会匹配到 "高性能 MySQL 第三版" 这个索引对象(原理大概这样,但细节很多)

消息堆积(多 worker),消息重复(消息确认)

接口重放与篡改(幂等性及安全校验)

Go 协程调度机制,没用过 go 语言,从操作系统层面讲一讲,对操作系统来说调度的最小单元是线程,协程附着与线程之上(用户态的线程)操作系统不会直接调度 go 的协程,只会调度 go 的线程,由 go 的线程来自行调度协程,此时在同一个线程上,不需要切换上下文,只需要在当前线程维护的协程就绪队列中取出一个就绪的协程将当前线程的寄存器,栈地址空间等改为就绪协程的寄存器,栈地址空间,就绪的协程即可执行,所以代价很低

以上这些没有查资料,完全凭自己的记忆与理解,可能不对,可能有些偏差,而且有些题目我感觉有些笼统,所以回答的也有些笼统,另外有很多细节的东西不是几句话能讲清楚的,为了能简单描述其原理,我省略了很多的细节,做了一些比喻,可能不太准确 另外看回复这些知识能找 17-22 的,我在成都才 8k,哭死,求大佬带。

3周前 评论
icebear 2周前
icebear 2周前
yaxiaomu 1周前
goodgood 1周前

@Krisji 这些问题之前都有学习过或了解过,能答个大概。真要答好,估计还得预先做好准备才能答得好。

1周前 评论
Krisji (楼主) 6天前

php有重载吗?c++定义的重载是函数名相同,参数不同

1周前 评论
Krisji (楼主) 6天前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!