Redis线程模型解析:单线程还是多线程?

发表时间: 2022-12-15 09:44

相信大家在很长的一段时间都会认为redis 是单线程模式,直到redis4.0版本之后,Redis陆续增加了一些多线程的功能,而到redis6.0之后就变成多线程模式了。难道单线程不香了吗?来,我们细细的品。

首先我们来看看作为单线程的佼佼者,为什么redis如此之快呢,redis在设计之初为什么要使用单线程呢,主要是有以下几点:

  1. 基于内存操作

redis的所有数据都是存在内存中的对于,基于内存速度是非常高的,运算都是内存级别的,能够达到一秒内处理10万个请求,所以他的性能比较高。

  1. 可维护性高

因为采用了单线程模式,能够避免因为多线程竞争和不必要的上下文切换,这就省去了多线程带来的一系列问题,而且单线程不会导致死锁问题的发生,更方便进行调试和测试。

  1. IO多路复用

redis使用了IO多路复用弄能用来监听多个连接客户端,由于绝大多数操作是纯内存的,所以处理的速度会非常快,这样就可以使用一个线程连接来处理多个请求,即便连接处理的请求很多,依然可以用告诉的内存处理来解决。

所以我们可以总结为,基于内存而且使用多路复用技术,单线程速度很快,又保证了多线程的特点。

那为什么需要多线程呢

  1. 读写网络的read/writ系统调用在redis执行期间占用了大量的CPU时间,如果把网络的读写做成多线程的方式将会对性能有很大的提升。
  2. 我们知道用del命令删除一个元素时,如果这个元素非常大,因为是单线程同步操作,这就会导致redis服务卡顿。

Redis4.0

所以在redis4.0版本中就新增了多线程模块,主要是为了解决删除数据较慢引起卡顿的问题,他的相关指令有三个: UNLINK、FLUSHALL ASYNC和 FLUSHDB ASYNC,这样就可以把删除工作放在后台进行。

Redis6.0

虽然4.0版本引入了多线程,但是只是用于大数据量的异步删除,然而对于非删除操作的意义不是很大。

所以在6.0版本新增了多线程的功能来提高IO的读写性能, 至此redis真正拥有了多线程模型。他主要的实现思路是将主线程的IO读写任务拆分出来,将变成了多线程,而命令的执行依旧是由主线程串行执行的,因此在多线程下操作redis不会出现线程安全的问题。

Redis不管当时的单线程设计,还是现在的多线程,其实最总目的只有一个,那就是让Redis变成越来越快,性能越来越好。