1 前言
Redis到底是单线程还是多线程的?
首先,Redis是一个高性能的分布式缓存中间件。其复杂性不言而喻,对于Redis整体而言肯定不是只有一个线程。
我们常说的Redis 是单线程,主要是指 Redis 在网络 IO和键值对读写是采用一个线程来完成的,这也是 Redis 对外提供键值存储服务的核心流程。但对于 Redis 的其他功能来说,比如持久化、异步删除、集群数据同步等,其实都是由额外的线程执行的。
2 为什么要融入多线程?
单线程的优势:
- 使用单线程可以避免频繁的上下文切换
- Redis 中有各种类型的数据操作,甚至包括一些事务处理,如果采用多线程,还可能因为加锁导致软件复杂度提升,更有可能会因为加解锁,甚至出现死锁,造成的性能损耗,所以使用单线程反而性能会更好
单线程的劣势:
- 无法发挥多核CPU的优势
- 当删除大建,会导致服务阻塞
- QPS达到瓶颈
基于上诉劣势,Redis也进行了相关优化,在4.0版本和6.0版本分别引入了Lazy Free和多线程IO。
3 Redis单线程模型
Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。
文件事件处理器的四个重要组成部分:
- 多个套接字请求
- IO多路复用器
- 文件事件派发器
- 事件处理器
Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型,如下图所示。