Redis 单线程
一言蔽之,Redis 不是单线程的,但其核心部分是单线程的。
一、Redis 是不是单线程的?
不是!Redis 的核心部分 - “键值对读写” 是单线程的。
Redis 4.0 之后,可以通过多线程执行大键值对的异步删除操作;
Redis 6.0 之后,通过多线程处理网络 IO;
而其它模块,例如持久化模块、集群支撑模块等,都是多线程的。
二、为什么说 Redis 改用多线程?
改用了,但没完全改用。
在 Redis 6.0 版本之前,”网络 IO” 和 “键值对读写” 都由一个线程完成。
随着网络硬件的性能提升,单线程在处理 “网络 IO” 时出现瓶颈,单个线程处理网络请求的速度跟不上底层网络硬件的速度。因此,Redis 6.0 版本改用多线程处理 “网络 IO”。
三、核心部分为什么是单线程?
- 一般来说,程序使用多线程有两个目的:一是平衡 CPU 与 IO 设备的速度差异,二是为了将任务拆分以加快运算速度。而 Redis 的 “键值对读写” 是直接访问内存中的数据,并且运算任务简单,使用多线程无法有效提升效率
- 多线程时,线程间切换会带来额外的性能开销
- 多线程时,必须考虑并发控制问题,如果引入 “锁” 等机制,影响性能的同时还会使系统设计更复杂
四、单线程为什么快?
Redis 数据存放于内存中
1
CPU 速度 >> 内存速度 >> 磁盘速度
Redis 使用了高效的数据结构
Redis 使用了单线程
- 避免多线程时的上下文切换带来的性能开销
- 避免并发问题
参考
- Redis
- Redis 教程 | 菜鸟教程
- Redis数据库学习教程(快速入门版)
- Redis 核心技术与实战