在高并发系统中(例如秒杀、热点商品查询、排行榜等),Redis 经常需要承担 几十万甚至百万 QPS 的访问压力。
要让 Redis 支撑百万 QPS,通常需要从 架构、数据设计、客户端、网络、系统优化 多个层面进行优化。
一、Redis 单机性能极限
首先需要了解 Redis 的基础性能。
Redis 单机性能通常:
| 环境 | QPS |
|---|---|
| 普通服务器 | 5万 ~ 10万 QPS |
| 高性能服务器 | 10万 ~ 20万 QPS |
原因:
- Redis 单线程模型
- 内存操作
- IO 多路复用
因此:
100万 QPS ≠ 单机Redis
必须通过 集群扩展。
二、Redis Cluster 横向扩展
Redis 支撑百万 QPS 的核心方式:
Redis Cluster
架构示例:
Redis Cluster
├── Node1
├── Node2
├── Node3
├── Node4
├── Node5
├── Node6
假设:
单节点 10万 QPS
6节点:
60万 QPS
10节点:
100万 QPS
Redis Cluster 使用:
16384 slots
数据分片到不同节点。
三、读写分离
Redis 支持 主从复制。
结构:
Master
↓
Slave1
Slave2
Slave3
写操作:
Master
读操作:
Slave
例如:
1写 + 3读
读性能提升:
3倍
四、本地缓存(减少 Redis 压力)
很多高并发系统会使用 两级缓存。
架构:
本地缓存
↓
Redis
↓
数据库
常见本地缓存:
- Caffeine
- Guava Cache
例如:
80%请求 → 本地缓存
20%请求 → Redis
Redis 压力降低:
80%
五、Pipeline 批量请求
Redis 网络 IO 也是瓶颈。
使用:
Pipeline
示例:
普通请求:
GET key1
GET key2
GET key3
Pipeline:
一次发送多个命令
效果:
减少网络往返次数
性能可提升:
5倍以上
六、Lua 脚本减少网络请求
Redis 支持:
Lua Script
例如秒杀库存:
普通方式:
GET stock
判断库存
DECR stock
需要:
3次网络请求
Lua脚本:
1次请求
同时保证:
原子性
七、热点 Key 优化
热点 Key 会导致:
单节点压力过大
解决方案:
1 Key 拆分
例如:
product:1001
拆分:
product:1001:1
product:1001:2
product:1001:3
product:1001:4
随机访问。
2 多副本 Key
例如:
rank:1
rank:2
rank:3
rank:4
客户端随机访问。
八、连接池优化
高并发系统必须使用:
Redis连接池
例如:
- JedisPool
- Lettuce
配置示例:
最大连接数:200
最小连接数:20
避免频繁创建连接。
九、网络优化
Redis 高 QPS 还需要网络优化。
例如:
使用内网通信
应用服务器 ↔ Redis
避免公网延迟。
使用高性能网卡
10G / 25G 网卡
减少网络瓶颈。
十、Redis 持久化优化
高并发场景通常:
关闭AOF
或者:
AOF everysec
避免磁盘 IO 影响性能。
十一、架构总结
Redis 支撑百万 QPS 通常需要:
Redis Cluster
读写分离
本地缓存
Pipeline
Lua脚本
热点Key拆分
连接池优化
网络优化
最终架构:
客户端
↓
本地缓存
↓
Redis Cluster
↓
数据库
十二、面试高分回答总结
如果面试官问:
Redis 如何支撑百万 QPS?
可以这样回答:
Redis 单机通常只能支撑 10 万 QPS 左右,要达到百万 QPS 通常需要通过 Redis Cluster 进行水平扩展,同时结合读写分离、本地缓存、Pipeline 批量请求、Lua 脚本减少网络开销,以及热点 Key 拆分等优化手段,从而实现百万级并发访问能力。


