测开面经学习笔记
1. mysql 和 redis的区别?
① 数据存储方式
- MySQL:数据以表格的形式以行和列的方式存储在磁盘上,支持复杂的关系型数据模型。
- Redis:数据存储在内存中,因此具有更快的读写速度,但受到内存容量的限制。
② 数据类型
- MySQL:支持各种数据类型,包括整型、浮点型、字符型、日期型等。
- Redis:支持丰富的数据类型,如字符串(String),列表(List)、哈希表(Hash)、集合(Set)、有序集合(Sorted Set)、位图(BitMap),还有三种特殊的数据类型 HyperLogLog(基数统计)、Bitmap (位图)、Geospatial (地理位置)。
③ 持久化
- MySQL:支持持久化存储数据,数据可以在磁盘上持久保存。
- Redis:可以选择是否持久化数据,支持RDB快照和AOF日志两种持久化方式。
④ 应用场景
- MySQL:适用于需要复杂查询和事务支持的应用,如企业级应用、电子商务平台等。
- Redis:适用于对速度要求较高、数据量较小、对数据结构要求较高的场景,如缓存、计数器、实时排行榜等。
2. Http 和 Https 的区别?
- HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
- HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
- 两者的默认端口不一样,HTTP 默认端口号是 80,HTTPS 默认端口号是 443。
- HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
3. Https 的安全性体现在哪里?
- 数据加密:HTTPS使用SSL/TLS加密协议对数据进行加密传输,防止数据在传输过程中被窃听或篡改。
- 身份验证:HTTPS使用SSL证书对服务器进行身份验证,确保通信双方的身份,防止中间人攻击。
- 数据完整性:HTTPS使用消息摘要算法(如SHA)来验证数据的完整性,确保数据在传输过程中没有被篡改。
4. TCP 的可靠性怎么保障的?
-
连接管理:即三次握手和四次挥手。连接管理机制能够建立起可靠的连接,这是保证传输可靠性的前提。
-
序列号:TCP将每个字节的数据都进行了编号,这就是序列号。序列号的具体作用如下:能够保证可靠性,既能防止数据丢失,又能避免数据重复。能够保证有序性,按照序列号顺序进行数据包还原。能够提高效率,基于序列号可实现多次发送,一次确认。
-
确认应答:接收方接收数据之后,会回传ACK报文,报文中带有此次确认的序列号,用于告知发送方此次接收数据的情况。在指定时间后,若发送端仍未收到确认应答,就会启动超时重传。
-
超时重传:超时重传主要有两种场景:数据包丢失:在指定时间后,若发送端仍未收到确认应答,就会启动超时重传,向接收端重新发送数据包。确认包丢失:当接收端收到重复数据(通过序列号进行识别)时将其丢弃,并重新回传ACK报文。
-
流量控制:接收端处理数据的速度是有限的,如果发送方发送数据的速度过快,就会导致接收端的缓冲区溢出,进而导致丢包。为了避免上述情况的发生,TCP支持根据接收端的处理能力,来决定发送端的发送速度。这就是流量控制。流量控制是通过在TCP报文段首部维护一个滑动窗口来实现的。
-
拥塞控制:拥塞控制就是当网络拥堵严重时,发送端减少数据发送。拥塞控制是通过发送端维护一个拥塞窗口来实现的。可以得出,发送端的发送速度,受限于滑动窗口和拥塞窗口中的最小值。拥塞控制方法分为:慢开始,拥塞避免、快重传和快恢复。
5. 常见的 Linux 指令
- ls:列出当前目录的内容
- grep:用于查找文件里符合条件的字符串或正则表达式
- chmod(change mode):修改用户对于文件的修改权限
- top:查看当前系统资源占用情况
- ps(process status):显示当前进程信息
- netstate:用于显示各种网络相关信息
- echo:在命令行输出指定内容
- tail:查看文件末尾部内容,跟踪文件的最新更改
- 管道符 | :将左端命令的结果 作为 右边命令 的输入
6. 数组和链表的区别?
- 访问效率:数组可以通过索引直接访问任何位置的元素,访问效率高,时间复杂度为O(1),而链表需要从头节点开始遍历到目标位置,访问效率较低,时间复杂度为O(n)。
- 插入和删除效率:
- 数组:需要移动其他元素,时间复杂度为O(n)
- 链表:需要寻找到需要插入或删除的位置,平均时间复杂度为 O(n/2) 即 O(n)
- 缓存命中率:由于数组元素在内存中连续存储,可以提高CPU缓存的命中率,而链表节点不连续存储,可能导致CPU缓存的命中率较低,频繁的缓存失效会影响性能。
- 应用场景:数组适合静态大小、频繁访问元素的场景,而链表适合动态大小、频繁插入、删除操作的场景
7. 设计测试用例:朋友圈点赞功能
① 用例 1:点赞功能正常使用
- 步骤:
- 打开朋友圈
- 打开一条动态
- 点击点赞按钮
- 预期结果:
- 点赞按钮状态 变为 已点赞
- 点赞数 +1
- 用户信息显示在点赞列表中
② 用例 2:取消点赞功能
- 步骤:
- 打开朋友圈
- 打开一条已点赞动态
- 再次点击点赞按钮
- 预期结果:
- 点赞按钮状态 变为 未点赞
- 点赞数 -1
- 用户信息从点赞列表中消失
③ 用例 3:多用户同时点赞
- 步骤:多个用户同时对同一条动态进行点赞操作。
- 预期结果:点赞数正确累加,点赞列表显示所有点赞用户信息。
④ 用例 4:点赞数据同步
- 步骤:用户在多端(如手机、电脑)对同一条动态进行点赞操作。
- 预期结果:点赞操作在所有设备上同步更新,保持一致性。
⑤ 用例 5:点赞功能异常处理
- 步骤:模拟网络异常或服务器故障时进行点赞操作。
- 预期结果:系统能够正确处理异常情况,保证数据的一致性和完整性。
8. TCP 和 UDP
- TCP:是面向连接的、可靠的、基于字节流的传输协议,适用于需要可靠传输、顺序传输、流量控制和拥塞控制的应用。
- UDP:是无连接的、不可靠的、基于数据包的传输协议。适用于实时性高、能容忍一定数据丢失的应用,以及需要减少通信开销的应用。