1.       自我介绍;

2.       TCP三次握手四次挥手:

1)       三次握手:

第一次:客户端向服务端发起请求,发送SYN请求建立连接,客户端进入SYN_SENT。

第二次:服务端回复SYN+ACK,同意建立连接并确认客户端请求,服务端进入SYN_RCVD(很短暂,表示接收到了报文)。

第三次:客户端发送ACK,确认与服务器建立连接,双方进入ESTABLISHED(已建立连接)。

2)       四次挥手:

第一次:主动方向被动方发送FIN,表示不再发送数据,进入FIN_WAIT1。

第二次:被动方向主动方回复ACK,确认关闭请求,主动进入FIN_WAIT2(此时被动方还可以发送数据)。

第三次:被动方向主动方发送完数据后,发送FIN,请求断开来连接。

第四次:主动方向被动方回复ACK,被动方直接断开连接,主动方等待后断开连接。

3.       Python中list和tuple的区别:

1)       List是列表,可变,能增删改元素。

2)       Tuple是元组,不可变,定义后不能修改(可作字典)。

4.       Tuple的不可变有什么优势:

1)       更安全,因为书库被定义后无法被篡改,适合存配置,常量,固定数据,防止误修改。

2)       满足哈希特性,可以作为字典键,集合元素。

3)       性能更高,内存占用更小,优于list。

4)       线程安全,不会被并发修改。

5.       优势举例:

1)       用作月份,坐标,星期一类不变的命名:Week = (“周一“,”周二“)

6.       开发中需要一个类似tuple的不可变结构,但同时又需要它包含可变的数据,比如一个list。你觉得这种需求该如何解决?

1)       使用元组嵌套列表:元组可以保证外层结构安全,不被篡改,内部的列表又可以自由修改数据

7.       想在文本文件中查找所有包含特定关键词的行,用什么命令?

1)       Grep “关键词” 文件名

8.       在实际使用中,如果你需要查找的关键词包含空格或者特殊字符,你会如何处理?

1)       可以用单双引号把关键词包裹。

2)       关键词含特殊字符,需要加反斜杠转义。(grep ‘3\.14’ test.txt)

3)       或者直接用-F把关键词当作纯字符。

9.       如果使用引号和选项来处理特殊字符,那如果你需要在多个文件中同时查找这个关键词,并且希望输出结果中显示匹配的文件名,你会怎么做?

1)       使用grep -F “关键词” test1.txt test2.txt

10.    Container和虚拟机vm有什么区别?

1)       架构层级上:

                  i.          虚拟机vm:硬件级虚拟化,每台vm都有独立完整的操作系统。

                 ii.          容器container:操作系统级虚拟化,共享宿主机内核,只有应用+依赖环境,没有独立系统。

2)       资源占用:

                  i.          Vm:占用大,开机慢。

                 ii.          Container:轻量,消耗资源低。

3)       隔离性:

                  i.          Vm: 隔离强,独立内核,安全性高。

                 ii.          Container: 隔离弱,共享内核,安全性低。

4)       操作系统限制:

                  i.          Vm: 可运行不同的操作系统。

                 ii.          Container:内核绑定,宿主机就只能运行linux容器。

5)       可移植性:

                  i.          Vm:镜像大,迁移繁琐。

                 ii.          Container:镜像小,移植性强。

11.    在实际生产环境中,如果需要在容器中运行一个对内核版本有严格要求的应用,而宿主机的内核版本不满足要求,如何解决?

1)       容器共享宿主机内核,无法单独对内核进行更换。生产环境中优先升级宿主机内核;如果不便内核升级,就把应用部署到虚拟机,虚拟机可以独立配置内核。也可以使用kata这类安全容器,自带独立内核。

12.    提到了升级宿主机内核或者转移到虚拟机作为解决方案,如果宿主机内核升级可能影响到其他容器的稳定性,而迁移虚拟机又增加了资源开销,你会如何权衡这两种方案的利弊并作出最终决定?

1)       看业务影响范围和重要程度:如果单个应用强依赖内核且是核心业务,应该优先迁移虚拟机。如果是非核心业务可以暂缓,看是否有更合适的应用可以替代。在明知会影响其他容器的情况下,应用不应该轻易部署,否者可能造成更大的后果。但整体业务不重要的情况下,也可以尝试部署应用,在影响到其他容器后立即回滚保障业务运行减小损失即可。

13.    数据库的四大特性ACID分别是什么?

1)       原子性:事务是不可分割的整体,要么全部执行成功要么全部失败。

2)       一致性:事务执行前后,数据库的整体数据状态保持一致,合法。

3)       隔离性:多个事务并发时,互相不干扰,各自独立运行,互不篡改数据。

4)       持久性:一旦事务提交成功,就会永久保存。

14.    对于隔离性,在实际应用中,数据库通常会提供不同的隔离级别,比如读未提交,读已提交,可重复读和串行化。你能解释一下这些隔离级别的区别,以及他们可能会导致的哪些问题?

1)       读未提交:一个事务能读到另一个事务还没有提交的数据。会产生脏读。

2)       读已提交:只能读到已经提交的数据。能解决脏读,但是会有不可重复读的问题产生。

3)       可重复读:事务启动后,读取到的数据是启动时的快照,全程数据不变。可以解决脏读和不可重复读,但是会产生幻读。

4)       串行化:级别最高,强制事务排队串行执行。可以解决之前提到的所有问题,但是并发性差,效率低。

15.    在可重复读的情况下会产生幻读,数据库是如何解决幻读的问题的,具体用到的哪些机制和技术?(网络搜集的回答:https://blog.csdn.net/m0_71777195/article/details/126968432)

1)       MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」,但是它很大程度上避免幻读现象(并不是完全解决了),解决的方案有两种:

                  i.          针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。

                 ii.          针对当前读(select ... for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读,因为当执行 select ... for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。

总结:后续还问了博主支付异常的链路排查问题,回答的依托,以前完全没有考虑到,被ai狠狠的拷打。Ai面试真的很有强度,但是感觉很公式化,大概就是一个大方向的细节考察,然后再在你的回答里挑出关键词来进行深入。在大的问题上跨度很大,思路一定得跟上,不然就很难受。