redis是单线程还是多线程?

70 阅读2分钟

redis6.x之前都是单线程的概念,但是6.x后版本引入了多线程的概念。那么面试题就来了,redis现在是单线程还是多线程?

针对这个问题我们要具体情况进行分析。1.当在执行redis命令时,此时毋庸置疑,redis还是使用单线程来执行的。2.那么多线程体现在哪个地方呢? 体现在两个方面,2.1redis将我们客户端请求的命令转换为真正redis的命令,这个地方用的多线程。因为我们在客户端输入的命令本质就是个字符串,比如set name “张三”,redis就会去解析这条字符串。之前单线程的操作 只会依次处理一个客户端,现在可以处理同时处理多个客户端的请求解析。2.2在redis把查询到的结果返回给客户端时,每当一个客户端与redis相连,在redis底层就会维护一个client,当执行命令后不会直接把结果返回给客户端,首先会把结果封装到一个client中,并加入一个队列。之前只能一个一个从队列中取,并返回给客户端。但现在用了多线程,所以可以多个client同时进行返回。

如果上面的讲解还不是很明白,我们就需要记住。1.执行命令肯定还是单线程。2.解析请求的字符串是多线程,返回结果时是多线程。

以上说清楚后,可能又会引发新的一个问题。

为什么redis要用单线程来执行命令呢?

抛开持久化不谈,redis是纯内存操作,执行速度是非常快的。他的性能瓶颈并不是速度,而是网络延迟,因此如果是多线程执行命令不仅不会很大提高速度,还要考虑一系列问题。

1.多线程下线程切换是要耗损性能的,频繁的线程切换会带来不必要的开销

2.引入多线程必然会牵扯线程安全问题,实现复杂度增高,并且性能也将大打折扣。