Skip to content

Commit

Permalink
docs: update docs
Browse files Browse the repository at this point in the history
  • Loading branch information
dingyuqi committed Dec 4, 2024
1 parent b085c86 commit 8787ce7
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 111 deletions.
51 changes: 25 additions & 26 deletions docs/notes/4. 面试题目/01.2024-09-25-Redis.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ createTime: 2024/09/25 15:54:57
permalink: /interview/uqcg8do8/
---
::: tip 提问
1. Redis有哪些常见的类型?
2. Redis对于已过期的数据如何淘汰?
3. 如何保证与MySQL之间的一致性?
1. Redis 有哪些常见的类型?
2. Redis 对于已过期的数据如何淘汰?
3. 如何保证与 MySQL 之间的一致性?
4. 为什么先操作数据库?
5. 应该更新缓存还是删除缓存?
:::
Expand All @@ -19,64 +19,63 @@ permalink: /interview/uqcg8do8/
4. List
5. Hash: dict

## Set和Zset之间的区别:
Zset是有序的, 额外提供了一个double类型的评分进行排序. 评分可以重复, 但是元素不能重复.
## Set 和 Zset 之间的区别:
Zset 是有序的, 额外提供了一个 double 类型的评分进行排序. 评分可以重复, 但是元素不能重复.

## Zset和List之间的区别:
List的元素可以重复, 实现上使用的是双向链表.
## Zset 和 List 之间的区别:
List 的元素可以重复, 实现上使用的是双向链表.

Zset保证元素之间的唯一性, 实现上使用的是哈希表.
Zset 保证元素之间的唯一性, 实现上使用的是跳表.

## 淘汰机制
详情见[Redis详解](/article/jbhd1al8/#淘汰机制)
详情见[Redis 详解](/article/jbhd1al8/#淘汰机制)


## 缓存一致性
我们先来看为什么会导致缓存与数据库的不一致. 这种不一致通常是由于多线程并发读写引起的.

### 延迟双删

#### 读操作
缓存命中, 直接返回;缓存没有命中则查询数据库, 写入缓存, 设定超时时间
缓存命中, 直接返回;缓存没有命中则查询数据库, 写入缓存, 设定超时时间.

#### 写操作
::: steps
1. 先删除缓存
1. 先删除缓存.

2. 再更新数据库
2. 再更新数据库.

3. 休眠一会(比如1秒), 再次删除缓存
3. 休眠一会(比如1秒), 再次删除缓存.
:::

### 为什么先操作数据库?
必须先==更新数据库==
必须先==更新数据库==.

我们来看如果先操作缓存会发生什么.

::: steps
1. 线程A发起一个写操作,第一步del cache
1. 线程 A 发起一个写操作,第一步 del cache.

2. 此时线程B发起一个读操作,cache miss
2. 此时线程 B 发起一个读操作,cache miss.

3. 线程B继续读DB,读出来一个老数据
3. 线程 B 继续读 DB,读出来一个老数据.

4. 然后线程B把老数据设置入cache
4. 然后线程 B 把老数据设置入 cache.

5. 线程A写入最新的数据到DB
5. 线程 A 写入最新的数据到 DB.
:::
此时数据库是新数据, redis是老数据, 不一致了.
此时数据库是新数据, Redis 是老数据, 不一致了.

### 到底是删除缓存呢,还是更新缓存?
应当 ==删除缓存==.

我们看如果不删除缓存而是更新缓存会怎么样:
::: steps
1. 线程A先发起一个写操作,第一步先更新数据库
1. 线程 A 先发起一个写操作,第一步先更新数据库.

2. 线程B再发起一个写操作,第二步更新了数据库
2. 线程 B 再发起一个写操作,第二步更新了数据库.

3. 由于网络等原因,线程B先更新了缓存
3. 由于网络等原因,线程 B 先更新了缓存.

4. 线程A更新缓存
4. 线程 A 更新缓存.
:::
此时数据库里面是B的数据, 而缓存里面是A的数据.
此时数据库里面是 B 的数据, 而缓存里面是 A 的数据.
32 changes: 16 additions & 16 deletions docs/notes/4. 面试题目/02.2024-09-26-事务.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,51 +11,51 @@ permalink: /interview/znj7ig7o/
4. 数据库事务的隔离级别?
:::
## 分布式事务一致性
### 2PC
### 2 PC
**第一阶段**
协调者向所有参与者发送命令, 参与者锁定资源, 本地执行. 如果执行成功则向协调者发送`ready`, 失败则发送`fail`
协调者向所有参与者发送命令, 参与者锁定资源, 本地执行. 如果执行成功则向协调者发送 `ready`, 失败则发送 `fail`.

**第二阶段**
如果所有协调者都发送了`ready`则协调者向所有参与者发送`commit`, 否则发送`rollback`全部参与者都进行回退.
如果所有协调者都发送了 `ready` 则协调者向所有参与者发送 `commit`, 否则发送 `rollback` 全部参与者都进行回退.

### TCC
在2PC的基础上先检查参与者的心跳, 保证参与者都能响应命令.
在 2 PC 的基础上先检查参与者的心跳, 保证参与者都能响应命令.

> 阿里提供`Seata`中间件可以保证分布式事务的一致性.
> 阿里提供 `Seata` 中间件可以保证分布式事务的一致性.
## 事务
事务Transaction指一个操作, 由多个步骤组成, 要么全部成功, 要么全部失败.
事务(Transaction)指一个操作, 由多个步骤组成, 要么全部成功, 要么全部失败.

- 原子性
- 一致性
- 持久性
- 隔离性

## 脏读/不可重复读/幻读
1. 脏读
1. 脏读.

读取未提交的数据
2. 不可重复读
读取未提交的数据.
2. 不可重复读.

前后多次读取的数据内容不一致
前后多次读取的数据内容不一致.

3. 幻读
3. 幻读.

前后多次读取数据的总量不一致
前后多次读取数据的总量不一致.

## 事务隔离级别
### 读未提交(Read Uncommited)
相当于没有做任何处理, 并发会导致的问题全部都会出现
相当于没有做任何处理, 并发会导致的问题全部都会出现.

### 读已提交(Read Commited)
只能读其他事务已经提交的数据, 可解决**脏读**问题.

==是大多数数据库的隔离级别, 但是不包括MySQL==
==是大多数数据库的隔离级别, 但是不包括 MySQL==.

### 可重复读(Repeatable Read)
在某事务的执行过程中不允许其他事务`update`, 但是允许`insert`
在某事务的执行过程中不允许其他事务 `update`, 但是允许 `insert`.

==MySQL使用的级别==
==MySQL使用的级别==.

### 可串行化(Serializable)
所有的事务串行执行, 不存在并发冲突.
Expand Down
16 changes: 8 additions & 8 deletions docs/notes/4. 面试题目/03.2024-09-25-Kafka.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,18 @@ permalink: /interview/5kl352fe/

## 重复消费
### 导致问题的原因
消费重复的本质原因是offset值的丢失, 主要有以下两个场景:
消费重复的本质原因是 offset 值的丢失, 主要有以下两个场景:
1. **宕机**

customer和broker之间5秒才同步一次offset. 如果出现宕机的清空可能导致offset没有及时提交, 那5秒之间的丢失了.
Customer 和 Broker 之间 5 秒才同步一次 offset. 如果出现宕机的清空可能导致 offset 没有及时提交, 那 5 秒之间的丢失了.

2. **再均衡机制**

如果customer在5分钟内没有处理完一批消息, 就会触发服务端partition再均衡(Rebalance)机制, 导致offset提交失败.
如果 Customer 在 5 分钟内没有处理完一批消息, 就会触发服务端 partition 再均衡(Rebalance)机制, 导致 offset 提交失败.

### 解决方案
1. 提高消费性能避免触发Rebalance.可以使用多线程并发, 调整超时时间还有减少每次从broker上拉取的条数来做到.
2. 使用`ConsumerRebalanceListener`监听, 然后在再均衡前后做收尾工作.
3. 使用消息幂等性
1. 开启Kafka幂等性功能
2. 及那个消息生成md5存入Redis, 在每次消费前先检查是否消费过
1. 提高消费性能避免触发 Rebalance. 可以使用多线程并发, 调整超时时间还有减少每次从 Broker 上拉取的条数来做到.
2. 使用 `ConsumerRebalanceListener` 监听, 然后在再均衡前后做收尾工作.
3. 使用消息幂等性.
1. 开启 Kafka 幂等性功能.
2. 及那个消息生成 md5 存入 Redis, 在每次消费前先检查是否消费过.
38 changes: 19 additions & 19 deletions docs/notes/4. 面试题目/04-2024-09-26-.索引.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ permalink: /interview/ailsfcvu/
::: tip 提问
1. 索引有哪些类型? 一般如何使用?
2. 索引用的哪些数据结构?
3. B+树是一种什么样的树, 为什么可以提高查询速度?
4. B+树的叶子节点的指针对索引的优势体现在哪里?
3. B+ 树是一种什么样的树, 为什么可以提高查询速度?
4. B+ 树的叶子节点的指针对索引的优势体现在哪里?
5. 命中了主键索引之后查询的时间复杂度是多少?
6. 联合索引的最左匹配, 是针对什么场景?
7. 现在有(A, B, C)的联合索引, 查询(B, C)的时候是否会命中联合索引?
Expand All @@ -23,40 +23,40 @@ permalink: /interview/ailsfcvu/

## 一般如何建立索引?
### 适合建立索引的字段
1. 频繁查询的字段
2. `WHERE``ON`出现的字段
1. 频繁查询的字段.
2. `WHERE``ON` 出现的字段.

因为SQL的优先级顺序为: `FROM` > `JOIN` > `WHERE` > `GROUP BY` > `HAVING` > `SELECT` > `DISTINCT` > `ORDER BY` > `LIMIT`
3. 有序的字段
4. 区分度高的字段: 简单来说就是值的种类较多的
因为SQL的优先级顺序为: `FROM` > `JOIN` > `WHERE` > `GROUP BY` > `HAVING` > `SELECT` > `DISTINCT` > `ORDER BY` > `LIMIT`.
3. 有序的字段.
4. 区分度高的字段: 简单来说就是值的种类较多的.

### 不适合创建的字段
1. 区分度低: 比如'性别'这种字段
2. 频繁更新的
3. 过长的字段
4. 无序的
1. 区分度低: 比如'性别'这种字段.
2. 频繁更新的.
3. 过长的字段.
4. 无序的.

## 索引的数据结构
MySQL使用的数据结构是 ==B+树==.
MySQL 使用的数据结构是 ==B+ 树==.

### 与B树的区别
B+树的中间节点不存放数据, 而B树的中间节点存放数据.
B+ 树的中间节点不存放数据, 而 B 树的中间节点存放数据.

### 优势
1. IO少
1. I/O 少.

由于中间节点不存放数据, 所以同样大小的节点可以存储更多的索引. 这会导致B+树比B树更加的"矮", 减少了磁盘的IO.
2. 范围查询
由于中间节点不存放数据, 所以同样大小的节点可以存储更多的索引. 这会导致 B+ 树比 B 树更加的"矮", 减少了磁盘的 I/O.
2. 范围查询.

B+树的叶子节点之间存在横向的指针. 如果查询的是一个范围内的数据, 无需从根节点重新查找, 可以从叶子节点直接横向访问.
B+ 树的叶子节点之间存在横向的指针. 如果查询的是一个范围内的数据, 无需从根节点重新查找, 可以从叶子节点直接横向访问.

## 最左匹配原则
当同时有多个字段的索引时, 最左边的索引将会生效.

## 联合索引生效
联合索引`(A, B, C)`意味着创建了`A`, `(A, B)``(A, B, C)`三个索引.
联合索引 `(A, B, C)` 意味着创建了 `A`, `(A, B)``(A, B, C)` 三个索引.

如果联合索引`(A, B, C)`, 查询`(B,C)`时联合索引将不会生效, 查询`(A, C)`时只有`A`的索引生效.
如果联合索引 `(A, B, C)`, 查询 `(B,C)` 时联合索引将不会生效, 查询 `(A, C)` 时只有 `A` 的索引生效.

## 命中索引后的查询复杂度
$O(logN)$
57 changes: 28 additions & 29 deletions docs/notes/4. 面试题目/05.2024-09-25-HTTP.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,56 +5,55 @@ createTime: 2024/09/26 14:17:10
permalink: /interview/kb78s161/
---
::: tip 提问
1. TCP和UDP的区别?
2. HTTP和HTTPS的区别?
3. HTTP1.0, HTTP2.0和HTTP3.0的区别?
4. 为什么HTTP3.0使用了UDP?
5. 常见的HTTP状态码
6. GET和POST的区别?
1. TCP 和 UDP 的区别?
2. HTTP 和 HTTPS 的区别?
3. HTTP 1.0, HTTP 2.0 和 HTTP 3.0 的区别?
4. 为什么 HTTP 3.0 使用了 UDP?
5. 常见的 HTTP 状态码
6. GET 和 POST 的区别?
:::

## TCP和UDP的区别
TCP是保证数据正确性的, 三次握手四次挥手. 使用滑动窗口保证乱序数据的正确性.
## TCP 和 UDP 的区别
TCP 是保证数据正确性的, 三次握手四次挥手. 使用滑动窗口保证乱序数据的正确性.

UDP是不保证正确性的.
UDP 是不保证正确性的.

## HTTP和HTTPS的区别
HTTPS是加密的.
HTTPS 是加密的.

HTTPS 经由 HTTP 进行通信, 但利用 **SSL/TLS** 来加密数据包. HTTPS 开发的主要目的, 是提供对网站服务器的身份认证, 保护交换数据的隐私与完整性.

## HTTP1.0, HTTP2.0和HTTP3.0的区别
## HTTP 1.0, HTTP 2.0 和 HTTP 3.0 的区别
### HTTP/1.1 相比 HTTP/1.0 提高了什么性能?
使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销.
支持管道(pipeline)网络传输, 只要第一个请求发出去了, 不必等其回来, 就可以发第二个请求出去, 可以减少整体的响应时间.

使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销
支持管道(pipeline)网络传输, 只要第一个请求发出去了, 不必等其回来, 就可以发第二个请求出去, 可以减少整体的响应时间

### HTTP2.0相对于HTTP1.0的优化
1. 头部压缩
2. 二进制格式
### HTTP 2.0 相对于 HTTP 1.0 的优化
1. 头部压缩.
2. 二进制格式.

1.0中使用的是纯文本
3. 多路复用
1.0 中使用的是纯文本.
3. 多路复用.

实现了真正的并发请求
4. 服务端推送
实现了真正的并发请求.
4. 服务端推送.

### HTTP3.0
放弃TCP, 使用UDP
### HTTP 3.0
放弃 TCP, 使用 UDP.

## 为什么HTTP3.0使用了UDP?
为了解决HTTP2.0中由于使用TPC导致的队头堵塞问题和连接时间过长的问题. 本质上是将TCP的重要功能转移到了用户态来解决, 不在内核中解决.
## 为什么 HTTP 3.0 使用了 UDP?
为了解决 HTTP 2.0 中由于使用 TPC 导致的队头堵塞问题和连接时间过长的问题. 本质上是将 TCP 的重要功能转移到了用户态来解决, 不在内核中解决.

## 常见的HTTP状态码
## 常见的 HTTP 状态码
| code | 含义 |
| ---- | ---------- |
| 200 | 成功 |
| 404 | 资源找不到 |
| 500 | 服务器错误 |

## POST和GET的区别
GET - 从指定的资源请求数据
POST - 向指定的资源提交要被处理的数据
## POST 和 GET 的区别
GET - 从指定的资源请求数据.
POST - 向指定的资源提交要被处理的数据.

| | GET | POST |
| ---------------- | ------------------------------------------------------------------------------------------------- |
Expand Down
Loading

0 comments on commit 8787ce7

Please sign in to comment.