<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>面试题 on Tequila's 学习笔记</title><link>https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/</link><description>Recent content in 面试题 on Tequila's 学习笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>© 2026 Tequila</copyright><atom:link href="https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/index.xml" rel="self" type="application/rss+xml"/><item><title>Go</title><link>https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/n-37e395229cd6ac88/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/n-37e395229cd6ac88/</guid><description>基础 # 1. 相比较于其他语言, Go 有什么优势或者特点？ # Go 允许跨平台编译，编译出来的是二进制的可执行文件，直接部署在对应系统上即可运行。​
Go 在语言层次上天生支持高并发，通过 goroutine 和 channel 实现。 channel 的理论依据是 CSP 并发模型， 即所谓的通过通信来共享内存； Go 在 runtime 运行时里实现了属于自己的调度机制：GMP，降低了内核态和用户态的切换成本。​
Go 的语法简单，代码风格比较统一
2. go是面向对象的吗 # 封装：Go语言里面字段首字母大小写来决定字段是否可以被外包访问 继承：Go语言里面用组合结构体的方式 或 接口继承来实现 多态：Go语言中通过接口来实现多态，不同的类型实现对应接口，然后调用接口变量的方法，结果取决于接口存储的对应类型的方法 3. golang 中 make 和 new 的区别？（基本必问） # make 只能用来分配及初始化类型为 slice、map、chan 的数据。new 可以分配任意类型的数据； new 分配返回的是指针，即类型 *Type。make 返回数据类型本身，即 Type； new 分配的空间被清零。make 分配空间后，会进行初始化； 4. 数组和切片的区别 （基本必问），切片怎么扩容 # 数组是值类型，长度固定​ 切片是引用类型，长度不固定，可以动态扩容 newcap = oldcap+(oldcap+3*256)/4 5. for i, v := range 切片，v地址会变化吗 # 地址不会发生变化，但是该地址的值是变化的，每遍历到一个元素，就把该元素值就会写到该地址​ PS：在最新版本Go 1.</description></item><item><title>Kafka</title><link>https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/n-66fce1621d2f77ea/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/n-66fce1621d2f77ea/</guid><description>1.应用场景 # 1.1 消息队列常见应用场景有哪些？ # 系统解耦：在重要操作完成后，发送消息到Kafka中，由别的服务系统来消费消息完成其他操作​ 流量削峰：一般用于秒杀或抢购活动中，来缓冲系统短时间内高流量带来的压力​ 异步处理：通过异步处理机制，可以把一个消息放入队列中，但不立即处理它，在需要的时候再进行处理​ 消息分发：比如一条消息需要传递给多个服务，这时候就可以用Kafka进行分发 1.2 什么情况下需要解耦？ # 比如发送短信场景，模块A发送消息给B，模块B发送短信给客户，A不需要得到回应，对于A而言只需要触达B就行了，这时候就可以引入消息队列，A将消息投递到了消息队列，B自己去处理，A不用再关心。这样可以收获更强的稳定性以及接口性能。
1.3 什么情况下需要削峰？ # 比如一个模块B一瞬间收到100个请求，如果B的承压能力非常差，或者B有什么资源限制，那么这100个请求下来，B可能就挂了或者报错了，这时候就可以引入消息队列，前置服务先将消息打到消息队列，B再根据自己的消费能力逐步消化。
1.4 什么情况下需要分发消息？ # 比如信息更新场景，某个用户信息更新了，而B、C、D三个模块都需要缓存这个信息，那么用户信息更新之后就可以发一条信息到消息队列，B、C、D只要订阅了相关主题，就都可以获得这条信息并做对应的缓存更新。
1.5 在项目开发中，你会怎么选择消息队列？ # 我会对比常见的几个消息队列，从功能性、性能、健壮性上去做对比，比如如果我们的性能要求非常高，我就会偏向于Kafka和RocketMQ这类性能又高，又自带扩展性的消息队列。​
当然还有一个考虑点就是团队技术栈，如果基本要求都满足，会更倾向于选择团队使用成熟的组件。
1.6 Kafka和RocketMQ有什么区别 # 我之前主要都是在研究/使用Kafka，RocketMQ只有一些粗浅的认知，比如RocketMQ可以支持更多的主题，适合于需要非常多主题的场景，以及RocketMQ的功能应该更完善一些，比如天然支持死信队列。
1.7 Kafka的优势是什么？ # Kafka优点非常多，我认为最核心的是
高吞吐 高可靠 天然支持分片水平扩展 另外还有一个非常重要的考量就是Kafka多年来被广泛使用，并且社区非常活跃，这就意味着它是经过市场验证的好产品。​
2.服务端 # 2.1 Kafka的大概框架是怎么样的 # 我们可以先把Kafka宏观看作三层：Producer，Server，Consumer，生产者发送消息，服务端负责存储消息，消费者负责拉取消息。 其中服务端其实就是由多个Broker节点组成，而我们平常说的主题就是在Broker节点上 Topic是个逻辑概念，实际物理存储形式是主题分片，也就是Partition
2.2 如何获取topic主题的列表 # Kafka是提供了获取主题列表的接口的，可以使用kafka-topics.sh 这个工具获取 如果要在我们业务服务来获取的话，那主流语言都是支持获取的，比如Java和Golang，都可以用KafkaAdminClient直接调用接口来获取。 2.3 有了Topic，为何还要Partition (Kafka 为什么要把消息分区) # 一般而言一个业务可以用一个主题，但是就算分了Topic，单个业务的信息还是可能会非常多，所以需要能进一步进行分治，也就是一个主题由多个Partition组成，这样相同的主题也具备了更高的并发度。
2.4 Partition是逻辑概念还是物理概念？ # Partition是物理概念，因为数据实实在在是写入到Partition文件里去的。而因为设计了Partition的存在，Topic就只是一个逻辑概念了。
2.5 介绍一下分区的分配策略 # Range Assignor：基于范围的分配策略，将分区按照范围分配给消费者。​ RoundRobin Assignor：基于轮询的分配策略，分区均匀地分配给消费者。​ Sticky Assignor：优先保持当前的分配状态，并尽量减少在再平衡过程中的分区移动。​ CooperativeStickyAssignor：和Sticky Assignor的策略是基本一样的，区别在于该协议将原来的一次大的全部分区重平衡，改成多次小规模分区重平衡。简单理解就是渐进式重平衡。 2.</description></item><item><title>Mysql</title><link>https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/n-55198287dba44f6a/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/n-55198287dba44f6a/</guid><description>SQL语法 # 1. count主键和count非主键结果会不同吗？ # 分析​ count()函数是返回表中某个列的非NULL值的数量。​
由于主键的列不能存NULL值，所以 count(主键) 返回的结果，可以表示数据库表中所有行数据的数量。​ 由于非主键的列可以存NULL值，那么count(非主键)返回表中非主键列的非NULL值的数量。​ 回答​ 主键是不能存NULL值的，所以 count 主键代表统计表中所有行数据的数量。​ 而非主键是可以存NULL值的，所以 count 非主键统计的是表中这个列的非NULL值的数量。
2. MySQL内连接、外连接有什么区别？ # 分析​ 内连接（INNER JOIN）：内连接返回两个表中匹配的行，即只返回两个表中共有的数据。 外连接（OUTER JOIN）：外连接则返回两个表中匹配和不匹配的行。MySQL 外连接主要有左外连接（LEFT JOIN）、右外连接（RIGHT JOIN）两种。​
左连接（LEFT JOIN）：SELECT * FROM A LEFT JOIN B ON A.A_id = B.B_id，将返回左表 A 中的所有行和右表 B 中与之匹配的行。如果 B 表中没有匹配的行，则 B 表相关的列使用 NULL 值填充。 右连接（RIGHT JOIN）：SELECT * FROM A RIGHT JOIN B ON A.A_id = B.B_id，将返回右表 B 中的所有行和左表 A 中与之匹配的行。如果 A 表中没有匹配的行，则 A 表相关的列使用 NULL 值填充。 回答 ​ 内连接和外连接都是用于连表查询。​</description></item><item><title>Redis</title><link>https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/n-0986afecafe535ac/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/n-0986afecafe535ac/</guid><description>认识Redis # 1. 什么是Redis？ # Redis是一个开源的内存数据结构存储系统，支持多种数据结构（如字符串、哈希、列表、集合等），常用于缓存、分布式锁。它通过将数据存储在内存中实现高速读写，并支持持久化到磁盘，确保数据安全。Redis还提供主从复制、事务和Lua脚本等功能，适用于高并发场景。
2. 使用 Redis 有哪些好处？ # 读取速度快，因为数据存在内存中，所以数据获取快；​ 支持多种数据类型，包括字符串、列表、集合、有序集合、哈希等；​ 还拥有其他丰富的功能，队列、主从复制、集群、数据持久化等功能。 3. 为什么MySQL做存储，Redis做缓存？ # MySQL是数据库系统，对于数据的操作需要访问磁盘，而将数据放在Redis中，需要访问就可以直接从内存获取，避免磁盘I/O，提高操作的速度，使用Redis+MySQL结合的方式可以有效提高系统QPS。
4. Redis 常用的业务场景有哪些？ # Redis常用业务场景包括缓存、计数器、分布式锁、排行榜等，其中缓存和分布式锁是最核心和广泛的应用场景。
Redis数据对象 # 5. Redis 的数据类型有哪些？ # String（字符串），Hash（哈希），List（列表），Set（集合）、Zset（有序集合） 字符串、map、链表、哈希表、有序集合
6. Redis有哪些底层数据结构？ # String # 7. Set一个已有的数据会发生什么？ # Set一个已有数据会覆盖原有的值，同时会覆盖或者擦除键的过期时间
8. 浮点型在String是用什么表示？ # 要将一个浮点数放入字符串对象里面，需要先将这个浮点数转换成字符串值，然后再保存转换所得的字符串值。​
浮点数在字符串对象里面是用字符串值表示的，用Raw还是Embstr编码，取决于转换后字符串的长度
9. String可以有多大？ # 一个Redis字符串最大为512MB
10. Redis字符串是怎么实现的？ # Redis字符串底层是String对象，String对象有三种编码方式：INT型、EMBSTR型、RAW型。如果是存一个整型，可以用long表示的整数就以INT编码存储；如果存字符串，当字符串长度小于等于一个阈值，使用EMBSTR编码；字符串大于阈值，则用RAW编码。在我用的5.0.5版本中阈值是44。
11. 为什么EMBSTR的阈值是44？ # Redis的字符串对象是由redisObject和sdshdr这两部分组成
redisObject 16字节，sdshdr中已分配、已申请、标记三个字段固定占了3个字节，&amp;rsquo;\0&amp;rsquo;占了一个字节，能存放的数据就是 64-（16+4） = 44。
struct __attribute__ ((__packed__)) sdshdr8 { uint8_t len; uint8_t alloc; unsigned char flags; char buf[]; }; 12.</description></item><item><title>Untitled</title><link>https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/n-309c0e6f80928520/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/n-309c0e6f80928520/</guid><description/></item><item><title>计算机网络</title><link>https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/n-ab6e9a9cf0e56720/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/n-ab6e9a9cf0e56720/</guid><description>网络传输场景面试题（重点） # 网络分层模型（重要） # 1. 介绍一下 OSI 七层协议，各层协议都有哪些？ # 2. TCP/IP 网络模型有哪几层？ # 应用层：负责为应用软件提供网络服务，例如HTTP、HTTPS、DNS等协议。​
传输层：负责为应用程序层提供数据传输服务，传输层协议主要有 TCP和UDP，TCP是可靠传输协议，UDP是不可靠的传输协议。​
网络层：负责主机寻址，打包和路由功能。 网络层的核心协议是IP、ARP、ICMP等协议。IP 协议负责寻址和路由，ARP协议负责获取MAC地址，ICMP负责提供诊断功能并报告错误。​
网络接口层：负责为网络层提供「链路级别」传输的服务，负责在以太网、WiFi 这样的底层网络上发送原始数据包，工作在网卡这个层次，使用 MAC 地址来标识网络上的设备。
3. IP 协议和 TCP 协议属于哪一层？ # IP 协议属于网络层，TCP 协议属于传输层。
4. 网络为什么要分层？ # 分层的目的是为了降低耦合，各层相互独立之后，上层可以不关心下层的实现，只关心下层提供的接口服务，有利于排查网络问题，能更精细定位问题所在哪一层。​
而且分层之后层一层之间不会产生关联性，不会因为某个层的改动，影响了其他层，比如我们应用层的 HTTP 协议，从 HTTP1.1 升级到 HTTP2.0 的时候，并不会对传输层、网络层等有影响，或者网络层的IPv4协议升级为 IPv6协议的时候，也不会影响应用层、传输层。
键入网址场景问题（重要） # 1. 输入网址后，期间发生了什么？ # 浏览器会先解析 URL，然后构造 HTTP 请求报文。​ 接着进行域名解析，将域名解析为 IP地址，系统缓存、本地系统 host 文件、本地 DNS 服务器、本地DNS服务器分别去根域名服务器-&amp;gt;顶级域名服务器-&amp;gt;权威域名服务器询问 由于HTTP是基于TCP传输的，所以在发送HTTP请求前，需要进行三次握手，在客户端发送第一次握手的时候，TCP头部会填上SYN标记位，同时填上目标端口和源端口的信息。源端口是浏览器随机生成的，目标端口要看是HTTP还是HTTPS，如果是 HTTP 默认目标端口是 80，如果是 HTTPS 默认是 443。​ 然后到网络层，会加上IP头，同时填上目标IP地址和源IP地址。​ 然后到数据链路层，会通过ARP协议，获取路由器的MAC地址，然后会加上MAC头，填上目标MAC地址和源MAC地址。​ 然后到物理层之后，直接把数据包，转发给路由器，路由器再通过下一跳，最终找到目标服务器，然后目标服务器收到客户的 SYN 报文后，会响应第二次握手。​ 当双方都完成三次握手后，如果是 HTTP 协议，客户端就会将 HTTP 请求就会发送给目标服务器；如果是 HTTPS 协议，客户端还要和服务端进行 TLS 四次握手之后，客户端才会将HTTP报文发送给目标服务器。​ 目标服务器收到 HTTP 请求消息后，就返回 HTTP 响应消息，浏览器会对响应消息进行解析渲染，呈现给用户。 2.</description></item><item><title>数据结构</title><link>https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/n-3a465e0108e8226c/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-d69eb5fbdf57b275/n-3a465e0108e8226c/</guid><description> 排序算法 平均时间复杂度 最好时间复杂度 最坏时间复杂度 空间复杂度 稳定性 备注 冒泡排序 (Bubble Sort) O(n²) O(n) O(n²) O(1) 稳定 实现简单，可提前结束 选择排序 (Selection Sort) O(n²) O(n²) O(n²) O(1) 不稳定 交换次数最少 插入排序 (Insertion Sort) O(n²) O(n) O(n²) O(1) 稳定 小规模数据表现优秀 希尔排序 (Shell Sort) O(n log n)~O(n²) O(n log n) O(n²) O(1) 不稳定 插入排序优化版 归并排序 (Merge Sort) O(n log n) O(n log n) O(n log n) O(n) 稳定 分治思想，链表排序常用 快速排序 (Quick Sort) O(n log n) O(n log n) O(n²) O(log n) 不稳定 面试出现频率最高 堆排序 (Heap Sort) O(n log n) O(n log n) O(n log n) O(1) 不稳定 适合TopK问题 计数排序 (Counting Sort) O(n+k) O(n+k) O(n+k) O(k) 稳定 适合整数范围较小 桶排序 (Bucket Sort) O(n+k) O(n+k) O(n²) O(n+k) 视实现而定 数据分布均匀时效果好 基数排序 (Radix Sort) O(d(n+k)) O(d(n+k)) O(d(n+k)) O(n+k) 稳定 按位排序</description></item></channel></rss>