第01章:Redis 是什么 —— 从零认识 Redis
本章目标
学完本章后,你将能够:
- 用自己的话解释 Redis 是什么
- 说出 Redis 为什么快(三个核心原因)
- 列举 Redis 至少 6 个应用场景
- 区分 Redis、MySQL、Memcached 的定位
前置知识
- 了解 MySQL 基本概念(什么是数据库)
- 无需 Redis 基础,本章从零讲起
1.1 什么是 Redis
Redis(Remote Dictionary Server)是一个开源的内存数据库。注意三个关键词:
| 关键词 | 含义 |
|---|---|
| 内存 | 数据存在内存里,断电可能丢(但有持久化机制) |
| 数据库 | 不是简单的缓存,支持多种数据结构和持久化 |
| 远程 | 通过网络访问,不是嵌入在程序里的 |
一句话:Redis 是一个把数据存在内存里的高性能 KV 数据库。
MySQL(磁盘数据库) Redis(内存数据库)
┌─────────────────┐ ┌─────────────────┐
│ 硬盘 (SSD/HDD) │ │ 内存 (RAM) │
│ 读写: ~0.1ms │ │ 读写: ~0.001ms │
│ 容量: TB级 │ │ 容量: GB级 │
│ 数据不丢 │ │ 断电可能丢 │
└─────────────────┘ └─────────────────┘1.2 Redis 为什么快
Redis 能达到 10万+ QPS(每秒处理 10 万个请求),原因有三:
原因一:纯内存操作
数据在内存里,没有磁盘 I/O。内存读写速度是磁盘的 1000 倍。
原因二:单线程模型
Redis 用单线程处理命令(Redis 6.0+ 网络 I/O 多线程,但命令执行还是单线程)。好处:
- 没有线程切换开销
- 没有锁竞争
- 没有并发问题
"单线程还这么快?" —— 因为瓶颈不在 CPU,而在网络 I/O。单线程够用了。
原因三:IO 多路复用
单线程可以同时监听多个网络连接,哪个有数据来了就处理哪个。就像餐厅服务员一个人同时服务多桌客人。
传统模型:一个请求 → 一个线程 → 读完数据 → 处理 → 返回
(1000 个请求 = 1000 个线程)
IO 多路复用:一个线程 → 监听 1000 个连接 → 谁有数据就处理谁
(1000 个请求 = 1 个线程)1.3 Redis 能做什么
| 场景 | 说明 | 用到什么 |
|---|---|---|
| 缓存 | 热点数据放 Redis,减少 MySQL 压力 | String, Hash |
| 排行榜 | 实时更新分数,查询排名 | Sorted Set |
| 计数器 | 点赞数、阅读量、库存 | String (INCR) |
| 分布式锁 | 多台服务器抢一个锁 | String (SETNX) |
| 消息队列 | 简单可靠的消息传递 | List, Stream |
| Session 存储 | 多台 Web 服务器共享 Session | Hash |
| 好友关系 | 共同好友、可能认识的人 | Set |
| 附近的人 | 地理位置查询 | Geo |
| 限流 | 控制 API 调用频率 | String, ZSet |
| 去重统计 | UV 统计、去重计数 | HyperLogLog, Set |
1.4 Redis vs MySQL
| 维度 | MySQL | Redis |
|---|---|---|
| 存储位置 | 磁盘 | 内存 |
| 读写速度 | 毫秒级 | 微秒级 |
| 数据模型 | 表(行+列) | KV + 多种数据结构 |
| 持久化 | 天然持久 | 可选(RDB/AOF) |
| 查询语言 | SQL | 简单命令 |
| 容量 | TB 级 | GB 级(受内存限制) |
| 典型用途 | 主存储 | 缓存/辅助存储 |
📌 Redis 不能替代 MySQL。Redis 速度快但容量有限,适合存热数据。MySQL 存全量数据。
1.5 Redis vs Memcached
两者都是内存 KV 存储,但:
| 维度 | Redis | Memcached |
|---|---|---|
| 数据类型 | 5+ 种 | 只有 String |
| 持久化 | ✅ | ❌ |
| 集群 | ✅ Cluster | ❌ |
| 事务 | ✅ | ❌ |
| 线程模型 | 单线程 | 多线程 |
| 适用场景 | 复杂业务 | 简单缓存 |
1.6 Redis 核心特性一览
| 特性 | 说明 |
|---|---|
| 多种数据结构 | String, Hash, List, Set, ZSet, Bitmap, Geo, Stream... |
| 持久化 | RDB 快照 + AOF 日志 |
| 主从复制 | 数据备份 + 读写分离 |
| 哨兵 Sentinel | 自动故障转移 |
| 集群 Cluster | 数据分片,水平扩展 |
| Lua 脚本 | 原子性执行多条命令 |
| 事务 | MULTI/EXEC(不支持回滚) |
| 发布订阅 | Pub/Sub 消息模式 |
| 过期策略 | TTL + 惰性删除 + 定期删除 |
| ACL | Redis 6.0+ 用户权限管理 |
常见错误
错误1:认为 Redis 只是缓存
很多人只把 Redis 当缓存用,其实它的数据结构(ZSet/Set/Geo/Stream)能做很多事情——排行榜、附近的人、消息队列都不需要"后端数据库"。
错误2:以为 Redis 数据不会丢
Redis 默认持久化是关闭的(RDB 有间隔,AOF 默认不开)。如果不配置持久化,重启就丢数据。
错误3:以为 Redis 可以替代 MySQL
Redis 是内存数据库,数据量受限于内存大小。100GB 的 MySQL 数据库全放到 Redis 需要 100GB+ 内存,成本高出几个数量级。
本章小结
- Redis = 内存 KV 数据库 + 多种数据结构
- 快的原因:纯内存 + 单线程 + IO 多路复用
- 能做的事远超"缓存":排行榜、分布式锁、消息队列、附近的人...
- Redis 是 MySQL 的"加速器",不是"替代品"
练习题
- 用自己的话解释 Redis 的三个"快"的原因。
- 列举 Redis 至少 6 个应用场景,并说明用到了什么数据结构(可以先猜)。
- 为什么 Redis 不能替代 MySQL?从容量和查询能力两个角度回答。
- Redis 和 Memcached 的三个核心区别是什么?
- (思考题)如果 Redis 是单线程,那为什么 Redis 6.0 要引入多线程?多线程用在了哪里?