这是《Redis 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。
1.1 从一个真实场景开始
假设商品详情页每次打开都要执行几十条 SQL:商品基础信息、SKU、库存、价格、优惠券、推荐位、评价统计。数据库能扛住每秒几千次查询,但大促时页面请求可能是每秒几万次,数据库会瞬间被打满。
最直接的做法是加索引、拆库、读库扩容,但这些都改变不了核心事实:详情页的数据被反复读取,而每次读取的结果几乎相同。
Redis 的价值在这里出现:
请求 -> 先查 Redis 命中 -> 直接返回
-> 未命中 -> 查数据库 -> 写入 Redis -> 返回
热点商品进入内存,数据库只处理冷数据和首次加载,读性能从毫秒级进入亚毫秒级。这是 Redis 最经典的用法,但它远不只是缓存。
1.2 Redis 是什么
Redis(REmote DIctionary Server)是一个基于内存的键值数据库,同时提供持久化和多种数据结构能力。
三个关键词:
- 基于内存:数据主要存内存,读写延迟极低,单实例常见可达 10 万 QPS 以上;
- 键值模型:所有数据通过 key 定位,value 支持字符串、哈希、列表、集合、有序集合、位图、流等结构;
- 可持久化:通过 RDB/AOF 将内存数据落到磁盘,用于重启恢复和数据留存。
Redis 的定位不是替代 MySQL。它更像一个“高速数据结构服务”:适合热点、临时、实时、可重建或可容忍有限丢失的数据;不适合作为复杂关系查询和超大容量的事实源。
1.3 Redis 的历史与版本脉络
Redis 由 Salvatore Sanfilippo(antirez)在 2009 年为解决意大利实时日志统计系统性能问题而开发,2010 年后逐渐成为缓存与实时系统的标准组件。
| 版本 | 时间 | 关键特性 |
|---|---|---|
| 1.x | 2009 | 基础数据结构与内存存储 |
| 2.x | 2010-2013 | 复制、AOF、虚拟内存(后移除) |
| 3.x | 2015 | Redis Cluster 分片 |
| 4.x | 2017 | Modules 生态、LRU 改进 |
| 5.x | 2018 | Stream 数据类型 |
| 6.x | 2020 | 多线程 IO、ACL、RESP3、TLS |
| 7.x | 2022 | Functions、Sharded Pub/Sub、AOF 改进 |
| 8.x | 2025 | 集成 Search/JSON/TimeSeries 等能力,性能与可观测性增强 |
说明:Redis 8 将部分 Redis Stack 能力整合进主版本,但本书主线仍是开源通用的核心 Redis 能力;涉及增强模块时会明确说明。生产选型还应关注许可协议、团队运维能力和替代项目(如 Valkey)。
1.4 Redis 为什么快
面试常问,也真正决定你能不能调优。答案不是简单的“内存快”,而是一组设计选择:
- 内存存储:避免磁盘随机 IO,主路径只访问内存;
- 高效数据结构:SDS、哈希表、跳表、紧凑列表等针对不同 value 类型优化;
- 单线程命令执行:命令执行没有锁竞争和线程上下文切换,路径简单;
- IO 多路复用:一个线程用 epoll/kqueue 管理成千上万连接;
- RESP 协议轻量:文本协议易解析,RESP3 提供更多语义但依然高效;
- 避免昂贵操作:多数操作 O(1)/O(logN),危险命令通过异步或拆分处理;
- 6.0+ IO 多线程:读写 socket 与协议解析可并行,命令执行仍单线程。
速记:
内存 + 高效结构 + 单线程执行 + epoll + 轻协议 + IO 多线程
但单线程也意味着:一个慢命令会拖住整实例。KEYS *、超大集合的全量读取、误用 Lua 长循环,都是事故源。
1.5 Redis 能做什么
1. 缓存
保存热点对象、页面片段、接口聚合结果,降低数据库压力。
2. 会话存储
Session、登录 token、验证码、设备状态。设置 TTL,天然适合短生命周期数据。
3. 计数器
阅读数、点赞数、库存扣减、限流窗口。INCR/DECR 原子执行。
4. 排行榜
ZSet 按 score 排序,支持实时更新与范围查询。
5. 分布式锁
用 SET key value NX PX ttl 做互斥;成熟方案常用 Redisson 看门狗与可重入锁。
6. 消息与事件流
Pub/Sub 适合低延迟广播;Stream 支持消费组、ack 与 pending 记录。
7. 实时标签与画像
Set 做交并差,Bitmap 做签到与活跃用户统计,HyperLogLog 做海量 UV 估算。
1.6 Redis 不适合什么
- 大容量冷数据主存储:内存成本高,不适合 PB 级归档;
- 复杂关联查询:没有 join、group by、SQL 优化器;
- 强事务业务主库:事务能力有限,回滚不覆盖执行后的数据破坏;
- 高频大 key 读写:单线程会被慢命令阻塞;
- 对数据零丢失要求极高:异步复制与故障切换可能丢失最后一批写入,需业务或存储方案兜底。
一句话:Redis 负责“快”,数据库负责“真”。 不要把事实源从数据库里轻易拿走。
1.7 Redis、Memcached 与 KV 数据库对比
| 维度 | Redis | Memcached | etcd | DynamoDB 类 |
|---|---|---|---|---|
| 数据结构 | 丰富 | 仅 key/value 字符串 | KV/lease | KV/文档/索引 |
| 持久化 | RDB/AOF/混合 | 无 | Raft 日志 | 云托管 |
| 复制 | 主从/哨兵/Cluster | 客户端分片 | 强一致 Raft | 服务托管 |
| 事务 | MULTI/Lua,有限 | 无 | MVCC 事务 | 事务支持 |
| 一致性 | 可调,常见最终一致 | 缓存语义 | 强一致 | 可配置 |
| 典型用途 | 缓存/实时结构 | 纯缓存 | 元数据/配置 | 云上 KV |
Memcached 更简单纯粹;etcd 更强调强一致元数据;Redis 的优势是“内存 + 数据结构 + 生态完整”的组合。
1.8 Redis 学习地图
入门 实战 原理 运维 架构
01-06 章 -> 07-12 章 -> 13-19 章 -> 20-24 章 -> 25-29 章
命令/数据类型 客户端/锁/并发 内存/持久化/HA 监控/调优/迁移 缓存/多活/生态
初学者最常见的问题是“背命令”;中级工程师常见问题是“只会当缓存”;高级工程师必须理解:value 类型怎么选、内存怎么省、故障时怎么恢复、并发下是否正确。这本书会沿着这条路径推进。
1.9 环境准备
第 3 章前准备:
- Linux/macOS/WSL2 或 Docker;
- Redis 7.x/8.x 安装包或 Docker 镜像;
redis-cli可执行文件;- Java 示例使用 JDK 17+、Spring Boot 3.x;
- 建议同时准备一个 MySQL,用于第 25-26 章缓存一致性与项目实战。
本章小结
- Redis 是基于内存的键值数据库,核心优势是内存 + 丰富数据结构 + 高效网络模型;
- 常用于缓存、会话、计数、排行、锁、限流、消息流和画像标签;
- 单线程命令执行让路径简单,也要求严格避免慢命令和大 key;
- Redis 不适合大容量冷存储、复杂查询和强事务事实源;
- 学习 Redis 的核心是同时掌握“怎么用”“为什么快”“什么时候会坏”。
思考题
- 你的系统中哪些数据适合放 Redis?哪些必须继续留在数据库?
- Redis 单实例 10 万 QPS,是否意味着可以直接横向扩到 1000 万 QPS?瓶颈还会出现在哪里?
- 如果 Redis 宕机 5 分钟,哪些业务可以降级,哪些必须强依赖?