Skip to content

Commit 4aac312

Browse files
committed
docs: 更新文档
1 parent 0bdc3c2 commit 4aac312

File tree

3 files changed

+41
-6
lines changed

3 files changed

+41
-6
lines changed

docs/12.数据库/KV数据库/Redis/Redis_面试.md

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ Redis 与 Memcached 的**差异**:
110110

111111
通过以上分析,可以看出,Redis 在很多方面都占有优势。因此,绝大多数情况下,优先选择 Redis 作为分布式缓存。
112112

113+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/4d3343ee229804d3c4fd23c9822aff29.jpg)
114+
113115
::: tip 扩展
114116

115117
[《脚踏两只船的困惑 - Memcached 与 Redis》](https://www.imooc.com/article/23549)
@@ -416,6 +418,8 @@ Redis 支持非严格的事务,其事务不支持回滚。[`MULTI`](https://re
416418

417419
`WATCH` 可以用于创建 Redis 没有内置的原子操作。
418420

421+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/28394fb19243eead19252521a4cef9f5.jpg)
422+
419423
举个例子,以下代码实现了原创的 `ZPOP` 命令,它可以原子地弹出有序集合中分值(`score`)最小的元素:
420424

421425
```shell
@@ -519,6 +523,8 @@ Redis 从 2.6 版本开始支持执行 Lua 脚本,它的功能和事务非常
519523
520524
Redis 的主从复制过程主要分为**建立连接、数据同步、命令传播**三个阶段。
521525

526+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/fa7bf64cc68abaa3c4fe79090b05bae6.png)
527+
522528
::: info 建立连接
523529
:::
524530

@@ -642,6 +648,8 @@ Redis Cluster 应用了 [Raft 协议](https://ramcloud.atlassian.net/wiki/downlo
642648

643649
**Redis Cluster = 虚拟哈希槽分区(数据分布) + 主从复制(数据冗余) + Raft 式故障转移(高可用) + 多数派防脑裂(一致性)**
644650

651+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/6dbb6bedcb2405edd2db642e3fe5a9b3.jpg)
652+
645653
::: info 集群架构
646654
:::
647655

@@ -717,6 +725,10 @@ HASH_SLOT = CRC16(KEY) mod 16384
717725

718726
![](https://raw.githubusercontent.com/dunwu/images/master/cs/database/redis/redis-ask.png)
719727

728+
**MOVED vs. ASK**
729+
730+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/386c33206cdceab7e5a733e271a76bd4.png)
731+
720732
::: info 故障转移
721733
:::
722734

@@ -809,6 +821,8 @@ Redis 解决脑裂的思路: 通过配置限制主节点的写操作条件,
809821

810822
并不能。假设在极限条件下,某主节点发生临时故障,哨兵判断其下线,开始发起选举。选举进行中,主节点恢复,此时它还有半数以上的从节点,仍能持续写入。当哨兵选举完毕,并选出新的主节点,旧主节点需要被强制认主新主节点,其在选举过程中写入的数据会被覆盖,导致了数据不一致。
811823

824+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/1e1614f6d492d01dc5a48fac9cc956f2.jpg)
825+
812826
## Redis 架构
813827

814828
### 【中等】Redis 为什么快?⭐⭐
@@ -852,9 +866,9 @@ Redis 并非真的只有单线。
852866

853867
为了提高网络 I/O 的并行度,Redis 6.0 对于网络 I/O 采用多线程来处理。但是,对于命令的执行,Redis 仍然使用单线程来处理。
854868

855-
Redis 官方表示,**Redis 6.0 版本引入的多线程 I/O 特性对性能提升至少是一倍以上**
869+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/5587520b37fed801d2bcf6ac17acca00.jpg)
856870

857-
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2023/09/e06ceb9d55034251ad2b584c24f23417.png)
871+
Redis 官方表示,**Redis 6.0 版本引入的多线程 I/O 特性对性能提升至少是一倍以上**
858872

859873
### 【中等】什么是 Redis 模块?有什么用?
860874

@@ -970,6 +984,12 @@ Redis 提供两种持久化方式:
970984

971985
**巧妙点**:去中心化设计,避免单点瓶颈,支持动态扩缩容。
972986

987+
### 【中等】Redis 的 Pub/Sub 功能是什么?
988+
989+
**Pub/Sub = 发布订阅模式,消息生产者(Publisher)发消息到频道(Channel),所有订阅者(Subscriber)实时接收**
990+
991+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/ba727edcc18e1c63f85c3b62df20af79.jpg)
992+
973993
## Redis 优化
974994

975995
### 【中等】为什么会有慢查询命令?
@@ -1214,4 +1234,4 @@ rdb dump.rdb -c memory --bytes 10240 -f redis.csv # 导出 >10KB 的 Key 到 CS
12141234
- **负载均衡**
12151235

12161236
- **Redis Cluster**:分散热点 Key 到不同节点
1217-
- **代理层**:Twemproxy / Redis Proxy / Nginx 实现负载均衡
1237+
- **代理层**:Twemproxy / Redis Proxy / Nginx 实现负载均衡

docs/12.数据库/KV数据库/Redis/Redis_面试_应用.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ cover: https://raw.githubusercontent.com/dunwu/images/master/archive/2025/03/020
55
date: 2020-07-13 17:03:42
66
categories:
77
- 数据库
8-
- KV数据库
8+
- KV 数据库
99
- Redis
1010
tags:
1111
- 数据库
@@ -137,6 +137,7 @@ permalink: /pages/9145dbc8/
137137
- **List 类型**:列表对象的编码可以是 `ziplist` 或者 `linkedlist`。当列表对象可以同时满足以下两个条件时,列表对象使用 `ziplist` 编码;否则,使用 `linkedlist` 编码。
138138
- 列表对象保存的所有字符串元素的长度都小于 `64` 字节;
139139
- 列表对象保存的元素数量小于 `512` 个;
140+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/3b6b3d715f35b4468490e74166dfe03d.jpg)
140141
- **Hash 类型**:哈希对象的编码可以是 `ziplist` 或者 `hashtable`。当哈希对象同时满足以下两个条件时,使用 `ziplist` 编码;否则,使用 `hashtable` 编码。
141142
- 哈希对象保存的所有键值对的键和值的字符串长度都小于 `64` 字节;
142143
- 哈希对象保存的键值对数量小于 `512` 个;
@@ -151,6 +152,8 @@ permalink: /pages/9145dbc8/
151152

152153
**`listpack` 是 Redis 5.0 引入的优化结构,用来替代 `ziplist`**,作为 `hash``list``zset` 数据类型的实现编码之一。
153154

155+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/708ef46c4a15dadd46c785b46453e157.png)
156+
154157
二者对比如下:
155158

156159
| 特性 | `ziplist` | `listpack` |
@@ -327,6 +330,10 @@ Redis 会在初始化服务器时, 共享值为 `0` 到 `9999`
327330

328331
## Redis 基础应用
329332

333+
### 【中等】如何使用 Redis 实现队列/栈?
334+
335+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/ea7a136e3f7e985cd630c3b0f6dafc86.jpg)
336+
330337
### 【中等】如何使用 Redis 实现排行榜?⭐⭐
331338

332339
各种排行榜,如:内容平台(视频、歌曲、文章)的播放量/收藏量/评分排行榜;电商网站的销售排行榜等等,都可以基于 Redis zset 类型来实现。
@@ -635,4 +642,4 @@ Redisson 内置的延时队列具备下面这些优势:
635642

636643
分布式锁相关面试内容见:[**分布式协同面试之分布式锁**](https://dunwu.github.io/waterdrop/pages/808cce55/#分布式锁)
637644

638-
:::
645+
:::

docs/15.分布式/分布式协同/分布式协同面试.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -920,6 +920,8 @@ ZooKeeper 分布式锁的**缺点**是:加锁、解锁操作,本质上是对
920920

921921
我们先来看一下,如何实现一个极简版本的 Redis 分布式锁。
922922

923+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/6eb25a1a7c2eb853cd036dbb59c81f71.png)
924+
923925
(1)加锁
924926

925927
Redis 中的 `setnx` 命令,表示当且仅当 key 不存在时,才会写入 key。由于其互斥性,所以可以基于此来实现分布式锁。
@@ -1047,6 +1049,8 @@ RedLock 分布式锁,是 Redis 的作者 Antirez 提出的一种解决方案
10471049

10481050
:::
10491051

1052+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/41d93a649c4710d2894f5e26092b44a4.jpg)
1053+
10501054
RedLock 分布式锁在普通 Redis 分布式锁的简单上,进行了扩展,其要点在于:
10511055

10521056
- (1)加锁操作不是写入单一节点,而是同时写入多个主节点,官方推荐集群中至少有 5 个主节点。
@@ -1088,6 +1092,8 @@ RedLock 分布式锁在普通 Redis 分布式锁的简单上,进行了扩展
10881092

10891093
RedLock 在遇到以上情况时,不能保证安全性。
10901094

1095+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/93d5abc8951a2ab7ca7a81ef9c47a0c2.jpg)
1096+
10911097
(2)RedLock 加锁、解锁需要处理多个节点,代价太高
10921098

10931099
> 总结来说,**已知的分布式锁,无论采用什么解决方案,在极端情况下,都无法保证百分百的安全。**
@@ -1096,6 +1102,8 @@ RedLock 在遇到以上情况时,不能保证安全性。
10961102

10971103
Redssion 分布式锁解决了原生 Redis 锁(`SET NX EX`)的 “锁续期、死锁、单点故障” 等痛点,核心逻辑可总结为 “原子加锁→看门狗续期→安全解锁→高可用扩展”,兼顾易用性和生产级可靠性。
10981104

1105+
![](https://raw.githubusercontent.com/dunwu/images/master/archive/2026/02/37b536443cbfdcb8bb5a26b8beada130.png)
1106+
10991107
**步骤 1:加锁(原子操作 + 可重入设计)**
11001108

11011109
客户端调用`lock()`/`lock(time, unit)`时,Redisson 执行以下逻辑:
@@ -1290,4 +1298,4 @@ Session 复制共享(Session Replication)**在服务器节点之间进行 Se
12901298

12911299
## 参考资料
12921300

1293-
- [**数据密集型应用系统设计**](https://book.douban.com/subject/30329536/) - 这可能是目前最好的分布式存储书籍,强力推荐【进阶】
1301+
- [**数据密集型应用系统设计**](https://book.douban.com/subject/30329536/) - 这可能是目前最好的分布式存储书籍,强力推荐【进阶】

0 commit comments

Comments
 (0)