Redis 为什么快

Redis 为什么快?

核心原因总览

复制代码
内存存储  +  单线程模型  +  高效数据结构  +  IO多路复用  +  简单协议
    ↓              ↓              ↓               ↓            ↓
 无磁盘IO      无锁竞争        O(1)操作       高并发连接     低解析开销

一、全内存操作(最根本原因)

存储介质 访问延迟
CPU 寄存器 < 1ns
L1 Cache ~1ns
内存 (RAM) ~100ns ✅ Redis
SSD ~100μs
机械硬盘 ~10ms

内存比磁盘快 10万倍,Redis 所有数据都在内存中,读写直接操作 RAM,无 IO 等待。


二、单线程模型(无锁竞争)

复制代码
客户端1 ──┐
客户端2 ──┤──→ [ 事件队列 ] ──→ [ 单线程处理器 ] ──→ 顺序执行命令
客户端3 ──┘

为什么单线程反而快?

  • 无线程切换开销:多线程的上下文切换本身消耗 CPU
  • 无锁竞争:不需要 mutex/spinlock,省去加锁解锁开销
  • CPU Cache 友好:单线程数据局部性好,Cache 命中率高
  • Redis 瓶颈不在 CPU:瓶颈在网络 IO,多线程意义不大

⚠️ 注意:Redis 6.0+ 引入多线程处理网络 IO(读写数据),但命令执行仍是单线程。


三、IO 多路复用(高并发连接)

复制代码
                    ┌─────────────────────────┐
连接1 (可读) ──→    │                         │
连接2 (可写) ──→    │   epoll / kqueue / select│──→ 单线程处理就绪事件
连接3 (等待) ──→    │                         │
连接N ...   ──→    └─────────────────────────┘
  • 基于 epoll(Linux)实现事件驱动
  • 一个线程同时监听成千上万个连接
  • 只处理已就绪的 IO 事件,不阻塞等待
  • 这就是 Redis 高并发的秘密

四、精心设计的数据结构

数据类型 底层结构 关键优化
String SDS(简单动态字符串) 预分配内存,O(1) 获取长度
List quicklist(双向链表+ziplist) 小数据用 ziplist 节省内存
Hash ziplist / hashtable 小数据压缩存储
Set intset / hashtable 纯整数用 intset,极省内存
ZSet ziplist / skiplist+hashtable 跳表 O(logN) 有序操作

以 SDS 为例(对比 C 字符串):

c 复制代码
// C 字符串获取长度:O(N) 遍历
strlen("hello") → 逐字符扫描

// SDS:O(1) 直接读 len 字段
struct SDS {
    int len;     // 直接返回,O(1) ✅
    int free;
    char buf[];
}

五、简单的通信协议(RESP)

复制代码
// SET key value 的 RESP 协议格式
*3\r\n          ← 3个参数
$3\r\nSET\r\n   ← 命令
$3\r\nkey\r\n   ← key
$5\r\nvalue\r\n ← value
  • 协议纯文本,解析极简单
  • 无 JSON/XML 序列化开销
  • 批量命令(Pipeline)减少网络往返次数

六、Pipeline & 批量操作

复制代码
# 不用 Pipeline:3次网络往返
Client → SET a 1 → Server
Client → SET b 2 → Server  
Client → SET c 3 → Server

# 用 Pipeline:1次网络往返
Client → SET a 1 / SET b 2 / SET c 3 → Server(打包发送)

网络延迟(RTT)往往是性能瓶颈,Pipeline 直接消除多余的网络等待。


七、总结

复制代码
┌────────────────────────────────────────────────┐
│              Redis 快的本质                     │
├──────────────┬─────────────────────────────────┤
│ 内存存储     │ 消除磁盘 IO,延迟降低 10 万倍    │
│ 单线程       │ 消除锁竞争和上下文切换开销       │
│ IO 多路复用  │ 单线程支撑万级并发连接           │
│ 优秀数据结构 │ 针对场景优化,时间/空间最优      │
│ 简单协议     │ 解析快,支持 Pipeline 批处理     │
└──────────────┴─────────────────────────────────┘

最终结果:单机 QPS 可达 10万+ / 秒,延迟 < 1ms

一句话:Redis 把"能预先做的都做了,能省的都省了"发挥到了极致。

相关推荐
Quincy_Freak14 分钟前
银河麒麟 aarch64 环境下轻量 SQLite 管理方案实践:SQLiteGo 落地体验
数据库·sqlite·sqlitego
灵机一物32 分钟前
企业选型参考:2026 CXL 内存扩展方案六强测评与落地指南
服务器·网络·数据库·人工智能
秋风渡.34 分钟前
MySQL_数据类型知识
数据库·mysql
Season4501 小时前
Redis命令 (generic即通用命令)
数据库·redis·bootstrap
liwulin05062 小时前
【ollama】自定义结构化输出
linux·前端·数据库·ollama
木易士心2 小时前
MyBatis数据源切换全面解析
数据库
新中地GIS开发老师2 小时前
地信职业百科④:GIS开发工程师
前端·数据库·gis·webgis·三维gis开发
云和恩墨2 小时前
从“第二存储”到多智能体协作,云和恩墨充实数据基础设施产品矩阵
数据库
ClouGence3 小时前
SAP HANA 到 Doris 数据迁移:4 种方案对比与迁移教程
数据库·后端·dba
霸道流氓气质3 小时前
ApiPost 中配置自动获取 Token 并调用业务接口完整指南
java·服务器·数据库