2处,如果策略为每秒刷盘:AOF_FSYNC_EVERYSEC,放到后台去刷盘。这里的放到后台,就是放到前面提到的任务队列中,由其他线程去刷。
void aof_background_fsync(int fd) { bioCreateBackgroundJob(REDIS_BIO_AOF_FSYNC,(void*)(long)fd,NULL,NULL); } void bioCreateBackgroundJob(int type, void *arg1, void *arg2, void *arg3) { struct bio_job *job = zmalloc(sizeof(*job)); job->time = time(NULL); job->arg1 = arg1; job->arg2 = arg2; job->arg3 = arg3; pthread_mutex_lock(&bio_mutex[type]); // 1 将新工作推入队列 listAddNodeTail(bio_jobs[type],job); bio_pending[type]++; pthread_cond_signal(&bio_condvar[type]); pthread_mutex_unlock(&bio_mutex[type]); }这里的1处,可以看到,将任务丢到了队列中,且前后进行了加锁。因为这个队列,是会被其他线程访问的,所以为了线程安全,进行了加锁。
todo void aeMain(aeEventLoop *eventLoop) { eventLoop->stop = 0; while (!eventLoop->stop) { // 如果有需要在事件处理前执行的函数,那么运行它 if (eventLoop->beforesleep != NULL) // 1 eventLoop->beforesleep(eventLoop); // 2开始处理事件 aeProcessEvents(eventLoop, AE_ALL_EVENTS); } }启动做的事实在太多了,本篇把1这里的这个函数讲了,下篇才能讲2.
总结本篇主要讲了,redis启动过程中,主循环的大流程,以及在主循环去处理一个事件之前,要执行的任务。这个主循环如何处理事件,放到下篇继续。