+
80
-

redis 属于单线程还是多线程?

请问redis 属于单线程还是多线程?

网友回复

+
0
-

redis是多线程也是多线程,原因如下:

在Redis4.0之前,Redis是单线程运行的,但是单线程并不代表效率就低,像Nginx、Nodejs也是单线程程序,但是它们的效率并不低。

原因就是Redis是基于内存操作的,它的瓶颈在于机器的内存、网络带宽,而不是CPU,在你CPU还没达到瓶颈时你的内存可能就先满了、或者带宽达到瓶颈了。因此CPU不是主要原因,那么自然就采用单线程了,况且使用多线程比较麻烦。

但是在Redis 4.0的时候,已经开始支持多线程了,Redis在4.0以及之后的版本中引入了惰性删除(也叫异步删除),意思就是我们可以使用异步的方式对Redis中的数据进行删除操作了,例如:unlink key、flushdb async、flushall async,举个例子:

127.0.0.1:6379> set name hanser
OK
127.0.0.1:6379> get name
"hanser"
127.0.0.1:6379> unlink name # 这里是异步删除一个key,同步的话则是del name
(integer) 1
127.0.0.1:6379> flushdb async
OK
127.0.0.1:6379> flushall async
OK

这样处理的好处就是不会使Redis的主线程卡顿,会把这些删除操作交给后台线程来执行。

通常情况下使用 del 指令可以很快的删除数据,但是当被删除的 key 是一个非常大的对象时,例如:删除的是包含了成千上万个元素的 hash 集合时,那么 del 指令就会造成 Redis 主线程卡顿,因此使用惰性删除可以有效的避免 Redis 卡顿的问题。

在Redis6.0中新增了多线程的功能来提高I/O的读写性能,它的主要实现思路是将主线程的I/O读写任务拆分给一组独立的线程去执行,这样就可以使多个socket的读写并行化了,但Redis的命令依旧是由主线程串行执行的。

但是注意:Redis6.0是默认禁用多线程的,但可以通过配置文件redis.conf中的io-threads-do-reads等于true来开启,完整配置为io-threads-do-reads true。但是还不够,除此之外我们还需要设置线程的数量才能正确地开启多线程的功能,同样是修改Redis的配置,例如设置io-threads 4,表示开启4个线程。 关于线程数的设置,官方的建议是如果为4核的CPU,那么设置线程数为2或3;如果为8核的CPU,那么设置线程数为6。总之线程数一定要小于机器的CPU核数,线程数并不是越大越好。
我知道答案,我要回答