Redis为什么这么快(IO多路复用与单线程模型)
Redis是单线程模型,为什么还能这么快?请详细解释Redis高性能的原因,包括IO多路复用(select/epoll)、纯内存操作、高效数据结构等方面。Redis 6.0的多线程IO是做什么的?
回答
小字辈
Redis高性能核心原因:
-
纯内存操作:
- 数据存储在内存中,读写速度极快(约10万+ QPS)
- 远快于磁盘IO(尤其是随机IO)
-
单线程模型:
- 避免了线程上下文切换的开销
- 避免了锁竞争(无锁编程)
- 避免了多线程导致的并发问题
- 使用事件驱动+非阻塞IO
-
IO多路复用:
- 使用epoll(Linux)/kqueue(macOS)/select(通用)
- 单线程可以同时监听多个socket连接
- 基于事件驱动,只在有读写事件时处理
- 时间复杂度 O(1)(相比select的O(n))
-
高效数据结构:
- SDS(简单动态字符串)避免C字符串O(n)长度计算
- 压缩列表(ziplist)、跳表(skiplist)等内存效率高
- 合适的底层编码(int/embstr/raw自动选择)
-
Redis 6.0多线程IO:
- 多线程只处理网络IO的读写(socket解析和写入)
- 命令执行依然是单线程(核心逻辑还是串行)
- 目的:利用多核CPU提升网络IO吞吐量(大包场景尤其明显)
- 默认关闭,通过io-threads配置开启
单线程瓶颈:大key操作(如KEYS命令)会阻塞其他请求