一、Redis为什么是单线程的?

1.redis在内存中运行,CPU不是性能瓶颈。

快:基于内存,避免磁盘I/O操作;采用key-value存储,数据操作时间复杂度为O(1);

多线程技术是为了充分利用CPU,但是redis吞吐量很大,1s能处理106个请求。所有redis操作都只在内存中完成,不会涉及任何I/O操作,速度够快。多线程上下文切换也要开销,频繁的对线程的上下文进行切换可能还会导致性能地急剧下降。

2.使用单线程也能并发处理客户端的请求

使用I/O多路复用机制并发处理来自客户端的多个连接,同时等待多个连接发送的请求。

在 I/O 多路复用模型中,最重要的函数调用就是 select 以及类似函数,该方法的能够同时监控多个文件描述符(也就是客户端的连接)的可读可写情况,当其中的某些文件描述符可读或者可写时,select 方法就会返回可读以及可写的文件描述符个数。

3.可维护性

多线程就是引入并发控制来保证多个线程同时访问数据时程序行为的正确性,需要打工人额外维护并发控制的相关代码,例如并发读写的变量上增加互斥锁等,一旦忘记获取锁或者忘记释放锁就可能会导致各种诡异的问题,管理相关的并发控制机制也需要付出额外的研发成本和负担。

二、为什么Redis4.0后的版本引入多线程支持?

在 Redis 4.0 之后的版本,情况就有了一些变动,新版的 Redis 服务在执行一些命令时就会使用 主处理线程 之外的其他线程,例如 UNLINK、FLUSHALL ASYNC、FLUSHDB ASYNC 等非阻塞的删除操作。

对于删除操作,如果键值对所占用的内存空间较小,单线程同步删除损耗也不会太大,如果键值对占用的内存空间较大,几十兆的文件,毫秒内是无法删除的,且释放内存也会有时间消耗,这些操作会阻塞其它操作,但是这些删除释放操作对其它操作并没有任何影响,所以可以异步执行,通过多线程非阻塞的释放内存空间,提高执行效率。

 

简言之,一切为了性能。