1. 基础原理
目标:能用 1~2 分钟讲清「Redis 是什么、为什么快、线程模型怎么演进」,并落到生产注意点。
Redis 是什么
基于内存的高性能键值存储。除 String / Hash / List / Set / ZSet,还有过期、持久化、Pub/Sub、Stream、Lua、弱事务等。
我在项目里主要当:
- 缓存层(热点读)
- 分布式协调(锁、限流、计数)
- 临时状态(登录会话、验证码、短时标记)
不是替代 MySQL 的持久业务库。
为什么快(口述四条)
- 内存访问,避免磁盘随机 IO
- 高效数据结构(如 SDS、跳表、压缩结构按量切换)
- I/O 多路复用,单线程处理命令也能撑高并发连接
- 命令简单,多数 O(1) / O(log N),避免复杂查询计划
加分:快不等于无限快——大 Key、热 Key、慢命令、网卡都会拖垮体感。
单线程 / 多线程
经典说法: Redis 执行命令的主线程是单线程的,所以单命令原子、无锁竞争。
容易踩坑的理解:
- 「单线程」指命令执行,不是整个进程只有一个线程(还有 BIO 线程、Redis 6 的 I/O 线程等)
- 一个慢命令(大 Key 的
HGETALL、KEYS *)会堵住后续所有命令
优化: 禁 KEYS,用 SCAN;删大 Key 用 UNLINK;拆大 Key;耗时逻辑放应用或异步。
IO 模型
主线程用 epoll/kqueue 等多路复用 监听连接,可读时读入、解析、执行、写回。
连接再多,也是「一个线程轮询就绪事件」,所以并发连接成本远低于「一连接一线程」。
Redis 6 之后的线程模型
Redis 6+ 引入可选的 I/O 线程:把读 socket / 写 socket 等部分工作并行化,命令执行仍主要在主线程,保证单命令语义简单。
口述:
6 之前瓶颈常在网络读写;6 之后可用多 I/O 线程提吞吐,但业务上仍要当成「命令串行执行」来设计,不能假设多个写命令在服务端并行交错执行同一逻辑。
核心优化清单
| 点 | 做法 |
|---|---|
| 慢命令 | 监控 slowlog;禁 KEYS;控制返回体积 |
| 大对象 | 拆 Key;分批删;UNLINK |
| 连接 | 连接池;避免每请求新建连接 |
| 版本 | 生产注明大版本;I/O 线程按压测开 |