# Redis

> Redis 是一个开源的内存数据结构存储系统，可用作数据库、缓存和消息中间件。掌握 Redis 是后端工程师的必备技能。

## 学习路径

```
1. 数据结构与编码（⭐⭐⭐⭐⭐）
   ├─ String、List、Hash、Set、ZSet 底层实现
   ├─ SDS、ZipList、QuickList、SkipList 等数据结构
   └─ 对象编码与优化策略

2. 持久化机制（⭐⭐⭐⭐⭐）
   ├─ RDB 快照持久化
   ├─ AOF 日志持久化
   ├─ 混合持久化（Redis 4.0+）
   └─ 持久化配置与性能优化

3. 高可用方案（⭐⭐⭐⭐⭐）
   ├─ 主从复制（Replication）
   ├─ 哨兵模式（Sentinel）
   ├─ 集群模式（Cluster）
   └─ 故障转移与数据同步

4. 应用场景（⭐⭐⭐⭐⭐）
   ├─ 缓存设计（缓存穿透、击穿、雪崩）
   ├─ 分布式锁（Redlock）
   ├─ 排行榜、计数器
   ├─ 消息队列
   └─ 布隆过滤器、HyperLogLog
```

## 核心要点

### 为什么 Redis 快？

1. **纯内存操作**：数据存储在内存中，读写速度极快
2. **单线程模型**：避免了线程切换和锁竞争（Redis 6.0 引入 I/O 多线程）
3. **高效的数据结构**：SDS、跳表、压缩列表等优化的数据结构
4. **I/O 多路复用**：使用 epoll/kqueue 处理并发连接
5. **简单的协议**：RESP 协议简单高效

### Redis vs Memcached

| 特性         | Redis             | Memcached |
| ---------- | ----------------- | --------- |
| **数据类型**   | 5种基本类型 + 高级类型     | 只支持字符串    |
| **持久化**    | 支持（RDB + AOF）     | 不支持       |
| **分布式**    | 原生支持 Cluster      | 需要客户端实现   |
| **事务**     | 支持（MULTI/EXEC）    | 不支持       |
| **Lua 脚本** | 支持                | 不支持       |
| **高可用**    | 主从、哨兵、集群          | 无         |
| **线程模型**   | 单线程（6.0+ I/O 多线程） | 多线程       |
| **内存淘汰**   | 8种策略              | LRU       |

## 主要内容

### 数据结构与编码

深入理解 Redis 底层数据结构是掌握其性能优化的关键：

* String: SDS（Simple Dynamic String）
* List: QuickList（ZipList + LinkedList）
* Hash: ZipList / HashTable
* Set: IntSet / HashTable
* ZSet: ZipList / SkipList + HashTable

### 持久化机制

Redis 提供两种持久化方式，确保数据不丢失：

* **RDB**：快照持久化，适合备份和灾难恢复
* **AOF**：日志持久化，更高的数据安全性
* **混合持久化**：结合 RDB 和 AOF 的优点

### 高可用方案

生产环境必须考虑的高可用架构：

* **主从复制**：读写分离，数据备份
* **哨兵模式**：自动故障转移
* **集群模式**：水平扩展，支持分片

### 应用场景

Redis 在实际项目中的典型应用：

* **缓存**：热点数据缓存，缓存问题解决方案
* **分布式锁**：保证分布式环境下的互斥性
* **计数器**：访问量统计、限流
* **排行榜**：利用 ZSet 实现
* **消息队列**：发布订阅、Stream

## 性能优化建议

1. **合理选择数据类型**：根据场景选择最合适的数据结构
2. **避免大 key**：单个 key 不要存储过大的数据
3. **设置合理的过期时间**：避免内存溢出
4. **使用 Pipeline**：批量操作减少网络往返
5. **监控慢查询**：通过 SLOWLOG 分析慢查询
6. **合理配置持久化**：根据业务需求平衡性能和安全

## 面试高频考点

1. Redis 为什么这么快？
2. Redis 的数据类型有哪些？底层实现是什么？
3. RDB 和 AOF 的区别？如何选择？
4. Redis 如何实现高可用？主从复制的原理？
5. 缓存穿透、击穿、雪崩的区别和解决方案？
6. 如何实现分布式锁？Redlock 算法？
7. Redis 的过期策略和内存淘汰策略？
8. Redis 的事务机制？与关系型数据库事务的区别？

## 学习建议

1. **先理解基础**：从数据类型和基本命令开始
2. **深入底层**：理解各数据类型的底层实现
3. **掌握持久化**：了解 RDB 和 AOF 的原理和配置
4. **实践高可用**：搭建主从、哨兵、集群环境
5. **解决实际问题**：学习缓存设计、分布式锁等应用场景
6. **性能调优**：通过实际项目积累优化经验

## 主题进度

* [x] 数据结构
* [x] 持久化机制
* [x] 高可用方案
* [x] 应用场景
