Skip to content
Gains Summary
Main Navigation 首页 / Home
C++ 编程 / C++ Programming
系统与高性能 / Systems & Performance
Web 开发 / Web Development
人工智能 / Artificial Intelligence
工业软件 / Industrial Software
其他内容 / Other Topics
C++ 编程 / C++系统与性能 / SystemsWeb 开发 / Web人工智能 / AI工业软件 / Industrial

外观

Sidebar Navigation

← Web 开发 / Web Development

中间件 / Middleware

1. Web 中间件全景 / The Web Middleware Landscape

2. 中间件——流量洪峰下的系统保护 / Middleware for Protecting Systems Under Traffic Spikes

cache layer

1. 缓存架构全景 / Cache Architecture Overview

2. Redis 深入——为什么你的缓存总是出问题 / Redis Internals and Cache Failure Modes

3. Redis 数据结构场景应用——什么时候用什么 / Choosing Redis Data Structures for Real Applications

4. 缓存策略——库存变了,缓存怎么处理 / Cache Strategies and Inventory Consistency

5. Redis 缓存三剑客——穿透/击穿/雪崩 + 一致性策略 / Redis Cache Penetration, Breakdown, Avalanche, and Consistency

6. Redis 分布式锁——从 SETNX 到 Redisson / Redis Distributed Locks from SETNX to Redisson

7. Redis Cluster 与 Sentinel 高可用架构 / Redis Cluster and Sentinel High-Availability Architecture

8. Redis 高级特性——Stream / PubSub / Module / LLM 应用

9. Redis 架构深度分析——为什么 Redis 能这么快 / Redis Architecture and the Sources of Its Performance

10. Redis 全景——为什么你的系统需要一个缓存层 / The Redis Landscape and Why Systems Need a Cache Layer

message queue

1. 消息队列全景——为什么你的系统需要一个中间人 / Message Queue Overview and Why Your System Needs a Middleman

2. Kafka 核心——为什么你的消息总是"丢"了 / Kafka Fundamentals and Message Delivery Semantics

3. 消息队列高级——死信队列、延迟消息、消息积压 / Advanced Messaging with Dead Letters, Delays, and Backlogs

4. Kafka Streams 与 Connect —— 让数据自己流动起来 / Kafka Streams and Connect for Streaming Data Pipelines

5. RabbitMQ 深度解析 —— 灵活路由与消息可靠性 / RabbitMQ Deep Dive into Flexible Routing and Reliability

6. 消息队列对比——为什么最终选了 Kafka / Comparing Message Queues and Choosing Kafka

search engine

1. 搜索引擎知识体系 / Search Engine Knowledge System

2. Elasticsearch——为什么 Like 查询总是那么慢 / Elasticsearch for Full-Text Search at Scale

3. Elasticsearch 查询 DSL 深入——为什么你的搜索总是不准 / Elasticsearch Query DSL Deep Dive

4. Elasticsearch 集群规划与运维——为什么你的集群总是"黄" / Elasticsearch Cluster Planning and Operations

5. Meilisearch 与轻量搜索替代方案——当 ES 太重时 / Meilisearch and Lightweight Search Alternatives

infrastructure

1. 基础设施组件全景 / Infrastructure Components Landscape

2. Nginx 与反向代理 / Nginx and Reverse Proxy

3. 服务发现 / Service Discovery

4. 配置中心 / Configuration Center

本页目录

Redis 全景——为什么你的系统需要一个缓存层 / The Redis Landscape and Why Systems Need a Cache Layer ​

📅 创建时间:2026-06-02 🏷️ 标签:#Redis #缓存层 #KV存储 #Memcached #缓存架构 📚 前置知识:[[/03-web/06-databases-and-data-access/05-redis]](Redis 数据结构基础) [[00-backend-overview]](后端技术全景) 📚 相关知识:[[01-redis-architecture]](架构分析) [[03-redis-cache-patterns]](缓存三剑客) [[/03-web/07-middleware/05-cache-strategy]](缓存策略)


场景:直接查数据库,系统越来越慢 ​

┌─────────────────────────────────────────────────────────────┐
│                                                             │
│  你做了一个电商网站。                                      │
│                                                             │
│  第一阶段:只有 100 个用户                                │
│  → 每个请求直接查 MySQL,响应时间 10ms,用户说"真快"   │
│                                                             │
│  第二阶段:1 万个用户                                      │
│  → 每天中午高峰期,MySQL CPU 80%,响应 500ms,用户说"卡" │
│                                                             │
│  第三阶段:10 万用户 + 秒杀活动                            │
│  → 同一时刻 5000 个请求同时查"商品详情"               │
│  → MySQL 被 5000 个连接打满,响应时间 5s,网站瘫痪       │
│  → 老板问:"为什么没抗住?"                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

这个问题几乎所有互联网公司都遇到过。数据库是磁盘 IO,天然慢——每次查询都要走磁盘读写,即使有索引,也要毫秒级。而内存访问是纳秒级,相差 1000 倍以上。


第1节:从数据库压力大到缓存层 ​

问题分析:数据库为什么扛不住? ​

┌─────────────────────────────────────────────────────────────┐
│                 数据库慢的根本原因                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  磁盘 IO 延迟:                                            │
│  内存访问:        ~100 纳秒(0.0001ms)                   │
│  SSD 顺序读取:    ~100 微秒(0.1ms)                       │
│  SSD 随机读取:    ~100 微秒(0.1ms)                       │
│  机械硬盘读取:    ~10  毫秒(10ms)                        │
│                                                             │
│  MySQL 单机 QPS 上限:                                     │
│  简单查询(命中索引):3000-5000 QPS                       │
│  复杂查询(多表 join):500-1000 QPS                       │
│                                                             │
│  结论:                                                     │
│  如果你的系统需要 10000 QPS,MySQL 无论如何优化都扛不住。 │
│  必须加一个缓存层,把"读请求"拦在数据库之前。            │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

解法:加一层缓存 ​

┌─────────────────────────────────────────────────────────────┐
│                 缓存层工作原理                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  无缓存:                                                   │
│  用户请求 → MySQL → 返回  (每次都查磁盘,10ms)           │
│                                                             │
│  有缓存:                                                   │
│  用户请求 → Redis(命中)→ 直接返回(0.1ms)✅           │
│  用户请求 → Redis(未命中)→ MySQL → 返回 + 回写缓存      │
│                                                             │
│  缓存命中率(Hit Rate)越高,MySQL 压力越小:               │
│  命中率 80%:MySQL 压力降为 1/5                            │
│  命中率 99%:MySQL 压力降为 1/100                          │
│                                                             │
│  缓存的本质:用空间换时间,存热点数据在内存中。            │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

缓存层的职责 ​

┌─────────────────────────────────────────────────────────────┐
│                 缓存层的四大职责                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 拦截热点读请求                                          │
│     → 80% 的请求集中在 20% 的数据(热点数据)             │
│     → 缓存这 20%,就能扛住大部分流量                       │
│                                                             │
│  2. 加速数据访问                                           │
│     → 内存 vs 磁盘:快 100-1000 倍                        │
│     → 用户体验:5s 卡顿 → 50ms 流畅                       │
│                                                             │
│  3. 保护数据库                                             │
│     → 缓存扛住 99% 的读请求                               │
│     → 数据库只处理 1% 的缓存 miss 和写请求                 │
│                                                             │
│  4. 降低数据库成本                                         │
│     → 不需要买超高配数据库服务器                           │
│     → 用几台普通机器搭 Redis 集群,成本低很多              │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

第2节:Redis 为什么是缓存层的首选 ​

缓存方案对比 ​

┌─────────────────────────────────────────────────────────────┐
│              主流缓存方案对比                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  │ 方案        │ 性能  │ 数据结构 │ 持久化 │ 生态  │ 选型  │
│  ├─────────────┼───────┼──────────┼────────┼───────┼──────┤
│  │ 本地 Map    │ 最快  │ 简单     │ 无     │ 无    │ 不推荐│
│  ├─────────────┼───────┼──────────┼────────┼───────┼──────┤
│  │ Memcached  │ 高    │ 仅 String│ 无     │ 一般  │ 备选  │
│  ├─────────────┼───────┼──────────┼────────┼───────┼──────┤
│  │ Redis      │ 高    │ 丰富     │ 支持   │ 强大  │ 首选 ✅│
│  ├─────────────┼───────┼──────────┼────────┼───────┼──────┤
│  │ CDN        │ 最高  │ 仅静态   │ 无     │ 有限  │ 静态资源│
│                                                             │
│  结论:Redis 是互联网系统缓存层的绝对主流选择。             │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Redis 相比 Memcached 的核心优势 ​

┌─────────────────────────────────────────────────────────────┐
│                 Redis vs Memcached                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 数据结构丰富                                            │
│     Memcached:只支持 String                               │
│     Redis:String / Hash / List / Set / ZSet / Stream      │
│     → 同一个 key,Redis 能做的事多得多                     │
│                                                             │
│  2. 持久化支持                                              │
│     Memcached:无持久化,重启即丢失                         │
│     Redis:RDB + AOF + 混合持久化                          │
│     → 重启后可从磁盘恢复数据                               │
│                                                             │
│  3. 集群支持                                                │
│     Memcached:客户端分片,功能弱                          │
│     Redis:Sentinel(高可用)+ Cluster(分片)              │
│     → 生产级别的高可用方案                                  │
│                                                             │
│  4. 过期策略                                                │
│     Memcached:LRU 淘汰                                     │
│     Redis:8 种淘汰策略,更灵活                             │
│                                                             │
│  5. 原子操作                                                │
│     Redis:INCR / DECR / HINCRBY 等原子命令               │
│     → 计数器、库存扣减天然支持                             │
│                                                             │
│  适用场景一句话:                                           │
│  如果只需要简单的 KV 缓存 → Memcached                      │
│  如果需要更多能力 → Redis(99% 的场景)                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

Redis 是什么:重新认识 Redis ​

┌─────────────────────────────────────────────────────────────┐
│                 Redis 的真实定位                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  很多人以为 Redis 只是"缓存"。                              │
│  实际上 Redis 是一个多功能的内存数据平台:                   │
│                                                             │
│  ✅ 缓存层          → 热点数据加速访问                       │
│  ✅ 分布式锁        → 跨进程同步                           │
│  ✅ 消息队列        → 轻量级异步通信(Stream)              │
│  ✅ 排行榜          → ZSet 实现实时排行                     │
│  ✅ 分布式 Session   → 跨服务器共享会话                     │
│  ✅ 限流器          → 接口防刷                             │
│  ✅ 实时统计        → UV / DAU / 滑动窗口                  │
│  ✅ LLM 应用        → 会话缓存 / Token 限流 / 向量搜索     │
│                                                             │
│  GitHub Stars: 67K+,是内存数据库领域的绝对霸主。          │
│  它几乎存在于每一个现代互联网系统的数据层中。               │
│                                                             │
│  一句话总结:                                               │
│  Redis 不只是一个缓存,它是后端工程师的"瑞士军刀"。         │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

第3节:Redis 的五大经典应用场景 ​

场景一:热点数据缓存(最核心) ​

┌─────────────────────────────────────────────────────────────┐
│                 热点数据缓存                                 │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  典型场景:                                                │
│  • 商品详情页(80% 请求集中在 20% 的爆款商品)             │
│  • 用户信息(每次请求都要查用户昵称、头像)                │
│  • 分类/标签配置(变化少,查询频繁)                       │
│                                                             │
│  架构:                                                   │
│  ┌─────────┐     ┌─────────┐     ┌─────────┐            │
│  │ 用户请求 │ ──▶ │  Redis  │ ──▶ │  MySQL  │            │
│  └─────────┘     └─────────┘     └─────────┘            │
│                       ↑                                    │
│                  缓存热点数据                               │
│                  访问延迟 0.1ms                            │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

场景二:分布式 Session ​

┌─────────────────────────────────────────────────────────────┐
│                 分布式 Session 共享                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  问题:多实例部署时,用户登录后请求可能打到不同服务器,    │
│        导致 Session 丢失。                                  │
│                                                             │
│  解决:Session 统一存在 Redis,各服务器共享读取。           │
│                                                             │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐                   │
│  │ 服务器 A │  │ 服务器 B │  │ 服务器 C │                   │
│  └────┬────┘  └────┬────┘  └────┬────┘                   │
│       │             │             │                         │
│       └─────────────┼─────────────┘                         │
│                     ▼                                        │
│              ┌────────────┐                                 │
│              │   Redis    │  ← Session 存储                 │
│              └────────────┘                                 │
│                                                             │
│  key = session:{token}                                     │
│  value = { user_id, username, role, login_time }           │
│  TTL = 2 小时                                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

场景三:分布式锁(秒杀系统核心) ​

┌─────────────────────────────────────────────────────────────┐
│                 分布式锁——库存扣减                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  问题:10 万人同时抢 100 部手机,如何保证不超卖?           │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐ │
│  │  传统方案:执行单条语句                               │ │
│  │  UPDATE products SET stock = stock - 1              │ │
│  │  WHERE id = 1 AND stock > 0;                        │ │
│  │  → 10 万 QPS 同时打 MySQL → 排队 → 数据库崩溃      │ │
│  └─────────────────────────────────────────────────────┘ │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐ │
│  │  Redis 方案:分布式锁                               │ │
│  │  SET lock:product:1 unique_id NX EX 30            │ │
│  │  → 抢到锁的人买手机 → 释放锁                       │ │
│  │  → 没抢到锁的人直接返回"已售罄"                  │ │
│  │  → 只有 100 个人进数据库,扛住 10 万 QPS         │ │
│  └─────────────────────────────────────────────────────┘ │
│                                                             │
│  更多细节:见 [[04-redis-distributed-locks]]               │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

场景四:实时排行榜 ​

┌─────────────────────────────────────────────────────────────┐
│                 ZSet 实现实时排行榜                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  场景:游戏战力榜、帖子热度榜、商品销量榜                   │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  ZADD leaderboard:posts 150 "post_001"            │   │
│  │  ZADD leaderboard:posts  89 "post_002"            │   │
│  │  ZADD leaderboard:posts 203 "post_003"            │   │
│  │                                                     │   │
│  │  ZREVRANGE leaderboard:posts 0 9 WITHSCORES        │   │
│  │  → 获取 Top 10,按分数降序排列                     │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  为什么 ZSet 快?                                          │
│  • 底层是跳表(SkipList)+ 哈希表                         │
│  • 查 Top N:O(log N + M),轻松应对千万级数据            │
│  • 增量更新分数:ZINCRBY,比重新排序高效百倍               │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

场景五:实时统计(UV / DAU / 滑动窗口) ​

┌─────────────────────────────────────────────────────────────┐
│                 实时统计三大场景                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. UV 统计(HyperLogLog):                                │
│     PFADD page:uv:2026-06-02 "user_001" "user_002"        │
│     PFCOUNT page:uv:2026-06-02                            │
│     → 12KB 内存,误差 ~0.81%,精确到百万级 UV              │
│                                                             │
│  2. 签到统计(Bitmap):                                    │
│     SETBIT user:1001:signin:2026 1 1   # 1月2日签到      │
│     BITCOUNT user:1001:signin:2026     # 总签到天数       │
│     → 一年 365 天 = 365 bits = 46 bytes                  │
│                                                             │
│  3. 滑动窗口限流(ZSet):                                   │
│     ZADD ratelimit:user:1001 {timestamp} {request_id}     │
│     ZREMRANGEBYSCORE ratelimit:user:1001 0 {now-60s}     │
│     ZCARD ratelimit:user:1001                            │
│     → 60 秒内超过 N 次请求 → 限流                         │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

第4节:Redis 在后端架构中的位置 ​

┌─────────────────────────────────────────────────────────────┐
│                 经典互联网后端分层架构                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  用户请求                                                    │
│      │                                                      │
│      ▼                                                      │
│  ┌────────────────────────────────────────────────────┐   │
│  │ 接入层                                               │   │
│  │  CDN(静态资源)  |  API 网关(限流/鉴权)          │   │
│  └────────────────────────────────────────────────────┘   │
│      │                                                      │
│      ▼                                                      │
│  ┌────────────────────────────────────────────────────┐   │
│  │ 业务层                                               │   │
│  │  应用服务  |  消息队列(Kafka)  |  定时任务         │   │
│  └────────────────────────────────────────────────────┘   │
│      │                                                      │
│      ▼                                                      │
│  ┌────────────────────────────────────────────────────┐   │
│  │ 数据层                                               │   │
│  │                                                      │   │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────────┐     │   │
│  │  │ Redis    │  │ MySQL    │  │ Elasticsearch│     │   │
│  │  │(缓存层)│  │(主存储) │  │(搜索)      │     │   │
│  │  └──────────┘  └──────────┘  └──────────────┘     │   │
│  └────────────────────────────────────────────────────┘   │
│                                                             │
│  Redis 位于"业务层"和"数据层"之间,                        │
│  扮演"缓存加速层"的角色。                                  │
│                                                             │
│  读请求:用户 → Redis(命中)→ 直接返回                   │
│  写请求:用户 → MySQL → 删除 Redis(保持一致)            │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

升华:从缓存层看系统设计的 trade-off ​

┌─────────────────────────────────────────────────────────────┐
│              加入 Redis 后,系统获得了什么,失去了什么        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  获得了:                                                   │
│  ✅ 读取性能:10ms → 0.1ms,快 100 倍                     │
│  ✅ 数据库保护:99% 的读请求被 Redis 拦截                  │
│  ✅ 可扩展性:加机器比升级数据库便宜                        │
│  ✅ 丰富功能:锁、队列、排行、统计一站式解决               │
│                                                             │
│  失去了(要接受的 trade-off):                             │
│  ⚠️  数据一致性:缓存和数据库可能有短暂不一致               │
│  ⚠️  运维复杂度:多了一个需要监控/维护的组件               │
│  ⚠️  内存成本:Redis 数据存在内存,容量受限于 RAM          │
│  ⚠️  复杂度提升:需要处理穿透/击穿/雪崩问题                │
│                                                             │
│  一句话总结:                                               │
│  性能和数据安全之间永远有 trade-off。                      │
│  互联网 99% 的场景选择 Redis 换性能,接受最终一致性。      │
│  只有银行、证券等强一致性场景才会选择不用缓存。            │
│                                                             │
│  接下来的章节,我们会深入 Redis 的架构原理、               │
│  理解为什么它能这么快,以及如何正确使用它。                │
│                                                             │
└─────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

"AI 可查 vs 必须理解"清单 ​

AI 可查:
✅ Redis 和 Memcached 的具体配置参数对比
✅ 各种语言的 Redis 客户端用法(redis-py / Jedis / StackExchange.Redis)
✅ CDN 和 Redis 缓存的适用场景区分

必须理解:
🔴 缓存的本质:用空间换时间,把热点数据放在内存中
🔴 数据库和 Redis 的访问延迟量级差异(磁盘 ms vs 内存 ns)
🔴 缓存命中率的概念:命中率越高,MySQL 压力越低
🔴 Redis 在经典分层架构中的位置(业务层和数据层之间)
🔴 为什么大部分互联网场景选 Redis 而不是 Memcached
1
2
3
4
5
6
7
8
9
10
11

学习状态:🟡 开始学习

最后更新于:

Pager
上一篇9. Redis 架构深度分析——为什么 Redis 能这么快 / Redis Architecture and the Sources of Its Performance
下一篇1. 消息队列全景——为什么你的系统需要一个中间人 / Message Queue Overview and Why Your System Needs a Middleman

持续记录,持续成长

Copyright © Tidenflow