Redis为什么这么快?
重要内容
- 纯内存操作 Redis 将所有数据存储在内存中,读写操作直接操作内存而非磁盘,避免了传统磁盘I/O的瓶颈。内存的访问速度比磁盘快数个数量级,这使得Redis的读写吞吐量可达每秒数十万次
- 单线程事件驱动模型
- 避免锁竞争与上下文切换:Redis 采用单线程处理客户端请求,消除了多线程场景下的锁竞争和线程切换开销(虽然6.0版本后引入了多线程处理网络I/O,但核心命令执行仍保持单线程,确保原子性和简单性)
- 非阻塞I/O多路复用:通过epoll/kqueue等系统调用实现多路复用,单线程可高效处理数万并发连接。事件驱动模型仅处理活跃的socket请求,减少无效等待
- 高效的数据结构设计 Redis 提供多种高效的数据结构(如字符串、哈希、列表、集合等),这些结构经过优化,能够快速完成各种操作
扩展知识
纯内存操作
Redis 的存储是基于内存的,直接访问内存的速度是远远大于访问磁盘的速度
单线程事件驱动模型
Redis 采用单线程处理客户端请求,消除了多线程场景下的锁竞争和线程切换开销
高效的数据结构设计
Redis基于 C语言实现了多种高性能数据结构,例如
- 简单动态字符串(SDS):支持二进制安全、预分配空间和惰性释放,获取字符串长度的时间复杂度为O(1)
- 压缩列表(ziplist):连续内存存储小数据,通过变长编码节省空间,适用于小型哈希、列表等
- 跳表(skiplist):实现有序集合(Zset),查询时间复杂度接近O(log n),且支持范围操作
- 快速列表(quicklist):结合链表和压缩列表的优势,提升大列表操作的效率
与传统数据库的对比优势
| 维度 | Redis | 传统数据库(如MySQL) |
|---|---|---|
| 存储介质 | 内存为主,磁盘为辅 | 磁盘为主,内存缓存有限 |
| 读写性能 | 10万+ QPS | 千级QPS(依赖索引和缓存) |
| 数据结构 | 支持字符串、哈希、集合等丰富类型 | 以表结构为主,类型较为固定 |
| 适用场景 | 缓存、计数器、实时应用 | 复杂查询、事务处理、持久化存储 |
| 扩展性 | 水平分片、集群化简单 | 分库分表复杂,扩展成本高 |