前言

      redis6.0主要重磅特性是多线程,本篇主要向大家讲解redis多线程的机制,在讲解多线程机制之前,先要看看redis的单线程机制。所以,本篇先来带大家回顾一下redis 6.0以前版本的单线程机制,再重点讲解redis6.0的多线程机制。

redis单线程机制

redis6.0之前的版本读取数据、执行操作和写入数据都是由work线程独自完成的。那么,redis6.0之前的版本也就是redis的单线程机制是什么样子的呢?请看下图所示。


redisson 线程池设置 redis6.0多线程_客户端

redis单线程机制


 

就像mysql数据库客户端和服务端的模式一样,一般我们使用redis通过redis客户端连接redis服务端进行通讯的。在上图中,我们假设有两个redis客户端与服务端进行通讯。下面我们看看它的流程是怎么样的。

1、当redis客户端1将数据(例如:set name william这样的命令)转成字节流经过IO多路复用(注意:图中省去了IO多路复用的流程)发给redis服务端work线程;

2、work线程为主线程,首先读取IO字节流数据,再执行计算IO操作;

3、执行计算IO操作完成后,再把结果写回IO,并以字节流的方式通过IO多路复用发给redis客户端1;

4、redis客户端1接收到IO字节流后,经过转换后显示结果。

同样,redis客户端2也是上面的执行流程。这里要注意的是,当redis客户端1和redis客户端2同时发送数据给服务端执行,因为work线程是单线程操作,所以是按照顺序依次执行。是不会并发执行的。这便是redis单线程的机制。

 

redis多线程机制

       简单说完redis单线程机制是为了着重介绍redis多线程的机制,好能区别具体的区别在哪。redis6.0版本开始使用了多线程的机制,同样我们使用一张图来详细描述具体多线程的流程。


redisson 线程池设置 redis6.0多线程_redis_02

redis多线程机制

 同样,我们以两个客户端为例,当然可以有多个客户端使用。注意:客户端和服务端通讯同样省去了多路复用的流程,因为我们重点不再多路复用的流程。接下来,看看具体流程:

1、当客户端1将数据以字节流发给redis服务端;

2、redis服务端1接收到IO数据后,首先创建一个IO子线程1来读取IO,并发送给work线程;

3、work线程接收到IO子线程1的数据后,执行操作。执行完后,再将结果发给IO子线程1(这里要注意:谁把数据给了work线程,work线程执行完,再把结果发给谁,不是乱发的);

4、IO子线程1进行写回IO,经过多路复用后,给到了客户端1;

5、客户端1再进行转换后,显示结果。

      同样,客户端2发送字节流给redis服务端,服务端会创建一个IO子线程2负责read IO,并将数据发给work线程进行执行IO操作,操作完成后,把结果返回给IO子线程2,IO子线程2最后再write IO后,通过多路复用给到了客户端2,最后客户端2进行转换后显示结果。整个流程完成。整个流程中,work线程仅负责执行操作,读取和写回IO不再由work线程担任,而是由IO子线程承担,这样以多线程通过空间换时间的方式,大大减少了整个流程的时间,提高了redis的运行效率。当然,虽然是多线程,但是work线程再执行操作任务时,仍然是按照顺序依次进行同步进行。OK,完成。

总结

本篇中,笔者首先带大家熟悉一下redis单线程的机制,方便理解多线程的机制。redis6.0引进了多线程,主要是IO多线程,但work线程依然是单线程操作。所以不要搞错哦。