2020年5月份,Redis正式推出6.0版本,其中多线程的特性引起了广泛的关注。
需要注意的是,Redis6.0版本的多线程,仅仅是针对网络请求采用了多线程,而数据的操作仍然是单线程。
Redis不是号称单线程已经有了很高的性能了吗?多路复用技术已经大大提升了IO利用率了,为什么还需要多线程?
主要还是因为随着越来越复杂的业务场景,需要有更高大的QPS,为了提升QPS,很多公司的做法就是搭集群,但这种做法你懂的。
之前讲过多路复用技术,它本质上仍然是同步阻塞的IO模型,所以限制Redis的性能瓶颈主要出现在网络IO的处理上。下面是select函数的处理过程:
从上图我们可以看出,调用select(其他函数同理)的过程中是阻塞的,所以瓶颈也就在这。
目前很多服务器都是多核的,在业务复杂度大的情况下,Redis采用单线程处理大量请求时会出现速度不够的情况,并且单线程也难以充分利用CPU资源。
因此,在Redis 6.0版本中引入了多线程模型,采用了一种称为“IO Threads”的多线程设计,以充分利用多核CPU的性能优势,提高Redis在多核环境下的性能表现。
具体来说,Redis 6.0版本中IO Threads模型采用了以下设计思路:
1.主线程:仍然采用单线程模型,负责接收客户端的连接请求,并将请求发送到IO线程处理。
2.IO线程池:IO线程池由多个线程组成,每个线程负责处理一部分网络I/O请求。IO线程池可以根据需要动态调整线程数目。
3.IO多路复用:每个IO线程采用IO多路复用机制,可以同时处理多个网络I/O请求。
4.事件通知:IO线程处理完网络I/O请求后,将结果通知主线程,由主线程将结果返回给客户端。
那么,在引入多线程之后,如何解决并发带来的线程安全问题呢?
还是前面提到的“Redis 6.0的多线程只用来处理网络请求,而数据的读写还是单线程”,所以并发问题也就不复存在了。