写点什么

有 php 转 go 项目经验者优先?

作者:王中阳Go
  • 2024-11-04
    北京
  • 本文字数:2376 字

    阅读完需:约 8 分钟

有php转go项目经验者优先?

新的一周又来了,今天分享的是上海某公司的一面面经,内容主要就是 go、mysql 和项目,职位要求如下:


发现一个很有意思的点---有 php 转 go 项目经验者优先。想不到还有这种好事,本人就是 php 转 go,跟我有相同经历的朋友可以加我微信,我们一起聊聊。

面试问题

Go 相关

往已关闭的 channel 里读写数据会发生什么?

  • 写操作:向已关闭的 channel 写入数据会导致运行时 panic。

  • 读操作:从已关闭的 channel 读取数据会立即返回,如果 channel 中还有值,则按顺序返回剩余值;当 channel 为空后,读操作将返回 channel 类型的零值。

Channel 的底层原理

Go 语言中的 channel 是通过一个结构体实现的,这个结构体包含了一个队列来存储发送到 channel 的数据元素。当一个 goroutine 向 channel 发送数据时,数据会被添加到这个队列中;另一个 goroutine 从 channel 接收数据时,它会从队列中移除数据。channel 可以是带缓冲或无缓冲的,无缓冲 channel 在发送方和接收方同步时直接传递数据,而带缓冲 channel 则允许在没有接收方的情况下暂存数据。

GMP 调度

Go 的并发模型基于 Goroutines(G)、M(Machine)和 P(Processor)。每个程序开始时都会创建一个运行时,运行时负责管理所有的 Goroutines。P 代表逻辑处理器,用于执行任务;M 是一个操作系统线程,可以执行用户代码或运行时代码;G 是用户定义的 goroutine。运行时使用工作窃取算法来平衡各个 P 上的负载,确保高效利用多核处理器。

Go 的协程之间要如何通信?

Go 推荐使用 channel 进行协程间的通信。通过 channel,协程可以安全地交换数据而无需担心竞态条件。此外,也可以使用互斥锁等同步原语来保护共享资源。

MySQL 相关

Explain 里哪些指标需要关注?

在 MySQL 的 EXPLAIN 输出中,应该关注以下指标:


  • type:连接类型,显示了表之间的连接方式,如全表扫描、索引扫描等。

  • key:实际使用的索引。

  • rows:查询优化器估计为了找到所需行必须检查的行数。

  • Extra:提供了关于 MySQL 如何解析查询的额外信息,例如是否使用临时表、排序等。

这些指标对 SQL 性能从低到高分别有哪些?

  • 全表扫描(ALL)通常是最慢的,因为它需要扫描整个表。

  • 索引范围扫描(range)比全表扫描快,但仍可能涉及大量行。

  • 使用索引(ref, eq_ref, const)可以显著提高查询速度,因为它们限制了需要访问的行数。

  • 索引覆盖(index)是指查询可以在索引树中完成,而不需要回表查找数据,这通常是最快的。

MySQL 的事务了解吗?什么是事务的 ACID?

事务是一系列操作,作为一个整体一起成功或者一起失败。ACID 是事务的四个基本特性:


  • 原子性(Atomicity):事务的所有操作要么全部完成,要么完全不发生。

  • 一致性(Consistency):事务前后数据库保持一致状态。

  • 隔离性(Isolation):并发事务的执行结果与串行执行的结果相同。

  • 持久性(Durability):一旦事务提交,其效果就是永久性的,即使系统发生故障也不会改变。

事务的 ACID 分别是怎么保证的?

  • 原子性:通过事务日志记录事务的操作,如果事务失败,可以根据日志回滚到事务开始前的状态。

  • 一致性:通过约束机制确保事务执行前后数据的一致性。

  • 隔离性:通过锁定机制或其他并发控制策略来实现,比如 MVCC(多版本并发控制)。

  • 持久性:事务提交后,确保数据已经写入到持久存储中,即使系统崩溃也能恢复。

Redo Log、Undo Log、BinLog 有哪些区别?

  • Redo Log:重做日志,用于记录事务对数据页所做的修改,以便在实例恢复时能够重做这些修改,保证数据的持久性和一致性。

  • Undo Log:撤销日志,用于支持事务的回滚操作,并且在 MVCC 中用于提供事务开始时的数据快照。

  • BinLog:二进制日志,记录了所有更改数据库的数据事件,用于数据恢复、复制和审计。

BinLog 文件有几种格式类型?分别有哪些优劣?

  • Statement:记录的是 SQL 语句,适用于大多数情况,但不能处理某些非确定性操作,如UUID()函数。

  • Row:记录的是每行数据的变化,可以准确地反映数据变化,但日志量较大。

  • Mixed:结合了前两种格式的优点,自动选择合适的格式来记录日志。

主从复制的原理是什么?复制的类型有几种?

主从复制的基本原理是主服务器将更改操作记录到二进制日志中,从服务器通过 I/O 线程读取这些日志并保存到本地的中继日志,然后通过 SQL 线程执行这些日志中的操作来保持与主服务器数据的一致性。


复制类型主要有:


  • 异步复制:最常用的复制方式,主服务器不等待从服务器确认即可继续处理新的请求。

  • 半同步复制:主服务器在收到至少一个从服务器的确认后才会认为事务已提交。

  • 同步复制:所有从服务器都确认后主服务器才提交事务,这种方式延迟较高。

数据写入 redo log 是不是一定不会丢失?

不是绝对的。虽然 redo log 是设计用来防止数据丢失的,但如果在数据写入 redo log 后但在数据真正持久化之前系统发生故障,仍然可能导致数据丢失。但是,一旦事务提交并且 redo log 条目已经被写入磁盘,那么即使系统崩溃,恢复过程中也可以根据这些日志恢复未完成的事务。

Buffer Pool 是什么?有什么作用?Buffer Pool 满了之后会发生什么?

  • Buffer Pool:是 InnoDB 存储引擎中的内存区域,用于缓存表的数据和索引页面,目的是减少磁盘 I/O 操作,提高查询性能。

  • 作用:加快数据检索速度,减少磁盘读写次数。

  • 满了之后:当 Buffer Pool 满时,InnoDB 会使用 LRU(最近最少使用)算法来替换旧的数据页,为新读取的数据页腾出空间。如果数据页被频繁访问,可能会导致频繁的页面替换,从而影响性能。

项目

  1. 为什么要重构?

  2. 项目中的业务流程问题你是怎么梳理的?用哪些工具梳理?

  3. 为什么通过 canal 与 binlog 来校验和修复数据?你还有其他方案吗?

  4. 是采用批量校验吗?

  5. 重构的周期大概多久?

  6. 分片计算肯定要消耗大量资源,这里你一共部署来几台实例呢?

  7. 项目中你是如何进行深度分页优化的?除了用 lastId,有没有其他方案?

  8. 谈谈你对 DDD 的理解

欢迎关注 ❤

我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。


没准能让你能刷到自己意向公司的最新面试题呢。


感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:infoq 面试群。

用户头像

王中阳Go

关注

靠敲代码在北京买房的程序员 2022-10-09 加入

【微信】wangzhongyang1993【公众号】程序员升职加薪之旅【成就】InfoQ专家博主👍掘金签约作者👍B站&掘金&CSDN&思否等全平台账号:王中阳Go

评论

发布
暂无评论
有php转go项目经验者优先?_php_王中阳Go_InfoQ写作社区