常聽到或是看到人說 Redis 是 single threaded,但始終沒有看到有人貼出程式碼證明這件事情。

事實上這是錯的,我們到 Github 直接搜尋 pthread_create,就可以發現其實在 redis/src/bio.c 裡面是有開 thread 來做 Background I/O 的,而且 redis 使用的 malloc lib 也就是 jemalloc,裡面也是會開 multithread 的。

請見原始碼

/* bio.c#L118-L128 */
/* Ready to spawn our threads. We use the single argument the thread
* function accepts in order to pass the job ID the thread is
* responsible of. */
for (j = 0; j < BIO_NUM_OPS; j++) {
    void *arg = (void*)(unsigned long) j;
    if (pthread_create(&thread,&attr,bioProcessBackgroundJobs,arg) != 0) {
        serverLog(LL_WARNING,"Fatal: Can't initialize Background Jobs.");
        exit(1);
    }
    bio_threads[j] = thread;
}

會說 redis 是 single threaded,純粹只是因為 main worker thread 只有一條,這和說 Node.js 是 single threaded 是相同的誤會。

之後來補一下為何要用 single main thread 實作,和他的優缺點。