一、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(connection *conn) {
client *c = connGetPrivateData(conn);
int nread, big_arg = 0;

本文详细介绍了Redis中的IO多线程原理,包括设置、线程池的工作流程和线程调度。在Redis中,IO操作可以在多线程中执行,主线程负责逻辑处理。通过设置io-threads-do-reads和io-threads来启用和配置IO多线程。内容涵盖从客户端读取任务到多线程处理读写任务的整个过程,并讨论了线程调度的细节。同时提供了C++后台开发的相关学习资源。
最低0.47元/天 解锁文章
1110

被折叠的 条评论
为什么被折叠?



