一、Redis中的IO多线程原理
服务端收到一条信息,给它deconde成一条命令
然后根据命令获得一个结果(reply)
然后将结果encode后,发送回去
redis的单线程是指,命令执行(logic)都是在单线程中运行的
接受数据read和发送数据write都是可以在io多线程(线程池)中去运行
在Redis中,生产者也可以作为消费者,反之亦然,没有明确界限。
二、设置io多线程(调试设置)
在redis.conf中
设置io-threads-do-reads yes就可以开启io多线程
设置io-threads 2,设置为2(为了方便调试,真正使用的时候,可以根据需要设置),其中一个为主线程,另外一个是io线程
在networking.c中找到stopThreadedIOIfNeeded,如果在redis-cli中输入一条命令,是不会执行多线程的,因为它会判断,如果pending(需要做的命令)个数比io线程数少,就不会执行多线程
因此提前return 0,确保执行多线程,便于调试
int stopThreadedIOIfNeeded(void) {
int pending = listLength(server.clients_pending_write);
/* Return ASAP if IO threads are disabled (single threaded mode). */
if (server.io_threads_num == 1) return 1;
return 0;//为了调试,提前退出(自己添加的一行)
if (pending < (server.io_threads_num*2)) {
if (server.io_threads_active) stopThreadedIO();
return 1;
} else {
return 0;
}
}
到此为止,只需要,运行redis-server,在networking.c的 readQueryFromClient中打个断点,然后在redis-cli中输入任意set key value就可以进入io多线程,进行调试
下图可以看到箭头指向的两个线程,一个是主线程,另一个是io线程
C++后台开发系统学习视频地址:C/C++Linux服务器开发高级架构师/C++后台开发架构师
以下学习资料,C++后台开发面试题,教学视频,C++后台开发学习路线图,免费分享有需要的可以自行添加:学习资料群720209036 自取
三、Redis中的IO线程池
1、读取任务readQueryFromClient
postponeClientRead(c)就是判断io多线程模式,并将任务添加到 任务队列中
void readQueryFromClient(con