Redis 6.0之前真的是单个线程吗?(后台线程那些事)

Redis通常被认为是单线程模型,但在处理耗时操作如关闭文件、AOF刷盘和惰性释放空间时,它使用了后台线程。本文详细介绍了Redis的三个后台线程:close_file、aof_fsync和lazy_free,以及它们如何通过生产者-消费者模式协同工作,以减轻主线程负担并提高性能。
摘要由CSDN通过智能技术生成

前言

本文参考源码版本为 redis6.2

我们常说 redis 是单线程模型,一般是指正常的 请求处理+周期任务。其中:

  • 处理请求包括:包括接收连接、IO监听/读/写以及命令执行。
  • 周期任务,如删除过期key、字典 rehash 等。

其实,还有一些非常耗时的操作,redis 通过专用的线程来处理,这里的专用线程,便是我们这篇文章的主角,我们接着往下看~

一、还有谁?

截止到目前,redis 共有三个后台线程,分别是 close_file、aof_fsync和lazy_free:

  • close_file 表示关闭相应文件描述符对应的文件(释放套接字、数据空间等)。
  • aof_fsync 表示 AOF 刷盘
  • lazy_free 表示惰性释放空间

截止 redis6.0 之前,关于 redis 的线程模型,我画了张图,你可以看下:

 

为了方便,我们将处理用户连接相关的线程称为主线程,反之为后台线程

换句话说,目前 redis 中存在两种线程(先不谈 redis 6.0 出现的 IO 线程);即,主线程后台线程

由于之前系列文章已经介绍了很多主线程相关东西(如果不清楚的话,可以找来看看),本文将主要介绍后台线程。

二、后台线程

1. 初始化

在 server.c#main 函数启动最后阶段,调用了方法 InitServerLast

// server.c#InitServerLast
void InitServerLast() {
    bioInit();
    initThreadedIO();
    set_jemalloc_bg_thread(server.jemalloc_bg_thread);
    server.initial_memory_usage = zmalloc_used_memory();
}

其中,bioInit() 则是后台线程初始化,bio 全名叫 Background I/O ,即后台IO:

void bioInit(void) {
    pthread_attr_t attr;
    pthread_t thread;
    size_t stacksize;
    int j;

    // 变量初始化
    for (j = 0; j < BIO_NUM_OPS; j++) {
        pthread_mutex_init(&bio_mutex[j],NULL);
        pthread_cond_init(&bio_newjob_cond[j],NULL);
        pthread_cond_init(&bio_step_cond[j],NULL);
        bio_jobs[j] = listCreate();
        bio_pending[j] = 0;
    }

    // 初始化线程栈大小
    pthread_attr_init(&attr);
    pthread_attr_getstacksize(&attr,&stacksize);
    if (!stacksize) stacksize = 1; /* The world is full of Solaris Fixes */
    while (stacksize < REDIS_THREAD_STACK_SIZE) stacksize *= 2;
    pthread_attr_setstacksize(&attr, stacksize);

    // 创建线程,下标 0,1,2 代表不同的线程
    for (j = 0; j < BIO_NUM_OPS; j++) {
        void *arg = (void*)(unsigned long) j;
        if (pthread_create(&thread,&attr,bioProcessBackgroundJobs,arg) != 0) {
            ser
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值