当前位置:   article > 正文

redis服务器

redis服务器

这一次主要讲下redis中服务器这个结构体相关代码,主要从是代码层面进行讲解

redis服务器

redis服务器结构体主要代码在redis.h/redisServer,下面给出该结构体源码,可以看到源码中对该结构体定义很长,这一节我们一点点分析,当然有些地方可能我也理解不到位hhh

// redis服务器实例
struct redisServer {
    char *configfile;   /* 配置文件的绝对路径 */
    int hz;      /* serverCron() 每秒调用的次数 */
    redisDb *db; /* 数据库数组,里面存放的是该服务器所有的数据库 */
    dict *commands;             /* 命令表(受到 rename 配置选项的作用) */
    dict *orig_commands;        /* 命令表(无 rename 配置选项的作用) */
    aeEventLoop *el;  /* 事件状态 */
    unsigned lruclock:REDIS_LRU_BITS; /* 最近一次使用时钟 */
    int shutdown_asap;          /* 关闭服务器的标识 */
    int activerehashing;        /* 在执行 serverCron() 时进行渐进式 rehash */
    char *requirepass;          /* 是否设置了密码 */
    char *pidfile;              /* PID 文件路径 */
    int arch_bits;              /* 架构类型32or64 */
    int cronloops;              /* serverCron() 函数的运行次数计数器 */
    char runid[REDIS_RUN_ID_SIZE+1];  /* 本服务器的 RUN ID ID在每秒都会变化 */
    int sentinel_mode;          /* 服务器是否运行在 SENTINEL 模式 */
    int port;                   /* TCP 监听端口 */
    int tcp_backlog;            /* TCP连接中已完成队列(完成三次握手之后)的长度 */
    char *bindaddr[REDIS_BINDADDR_MAX]; /* 绑定地址 */
    int bindaddr_count;         /* bindaddr地址数量 */
    char *unixsocket;           /* UNIX socket 路径 */
    mode_t unixsocketperm;      /* UNIX socket permission */
    int ipfd[REDIS_BINDADDR_MAX]; /* TCP套接字描述符 */
    int ipfd_count;             /* ipfd中使用的套接字数量 */
    int sofd;                   /* Unix套接字描述符 */
    int cfd[REDIS_BINDADDR_MAX];/* 集群总线监听套接字 */
    int cfd_count;              /* cfd使用到的套接字数量 */
    list *clients;              /* 链表,保存了所有客户端状态结构 */
    list *clients_to_close;     /* 链表,保存了所有待关闭的客户端 */
    list *slaves, *monitors;    /* 链表,保存了所有从服务器,以及所有监视器 */
    redisClient *current_client; /* C服务器的当前客户端,仅用于崩溃报告 */
    int clients_paused;         /* 客服端是否被paused */
    mstime_t clients_pause_end_time; /* 执行undo clients_paused的时间 */
    char neterr[ANET_ERR_LEN];   /* anet.c网络错误缓冲区 */
    dict *migrate_cached_sockets;/* MIGRATE缓冲套接字 */
    int loading;                /* 服务器是否正在被载入 */
    off_t loading_total_bytes; /* 正在载入的数据的大小 */
    off_t loading_loaded_bytes; /* 已载入数据的大小 */
    time_t loading_start_time; /* 开始进行载入的时间 */
    off_t loading_process_events_interval_bytes;
    // 常用命令的快捷连接
    struct redisCommand *delCommand, *multiCommand, *lpushCommand, *lpopCommand,
                        *rpopCommand;
    time_t stat_starttime;          /* 服务器启动时间 */
    long long stat_numcommands;     /* 已处理命令的数量 */
    long long stat_numconnections;  /* 服务器接到的连接请求数量 */
    long long stat_expiredkeys;     /* 已过期的键数量 */
    long long stat_evictedkeys;     /* 因为回收内存而被释放的过期键的数量 */
    long long stat_keyspace_hits;   /* 成功查找键的次数 */
    long long stat_keyspace_misses; /* 查找键失败的次数 */
    size_t stat_peak_memory;        /* 已使用内存峰值 */
    long long stat_fork_time;       /* 最后一次执行 fork() 时消耗的时间 */
    long long stat_rejected_conn;   /* 服务器因为客户端数量过多而拒绝客户端连接的次数 */
    long long stat_sync_full;       /* 执行 full sync 的次数 */
    long long stat_sync_partial_ok; /* PSYNC 成功执行的次数 */
    long long stat_sync_partial_err;/* PSYNC 执行失败的次数 */
    list *slowlog;                  /* 保存了所有慢查询日志的链表 */
    long long slowlog_entry_id;     /* SLOWLOG当前条目ID */
    long long slowlog_log_slower_than; /* 服务器配置 slowlog-log-slower-than 选项的值(SLOWLOG时间限制) */
    unsigned long slowlog_max_len;     /* 服务器配置 slowlog-max-len 选项的值(SLOWLOG记录的最大项目数) */
    size_t resident_set_size;       /* serverCron()中rss采样次数. */
    long long ops_sec_last_sample_time; /* 最后一次进行抽样的时间 */
    long long ops_sec_last_sample_ops;  /* 最后一次抽样时,服务器已执行命令的数量 */
    long long ops_sec_samples[REDIS_OPS_SEC_SAMPLES]; /* 抽样结果 */
    int ops_sec_idx; /* 数组索引,用于保存抽样结果,并在需要时回绕到 0 */
    int verbosity;                  /* 日志等级 Redis总共支持四个级别:debug、verbose、notice、warning,默认为notice */
    int maxidletime;                /* 客户端超时最大时间 */
    int tcpkeepalive;               /* 是否开启SO_KEEPALIVE选项 */
    int active_expire_enabled;      /* 测试时候可以禁用 */
    size_t client_max_querybuf_len; /* 客户端查询缓冲区长度限制 */
    int dbnum;                      /* 服务器初始化应该创建多少个服务器 config中databases 16可以设定该选项 */
    int daemonize;                  /* 如果作为守护进程运行,则为True */
    // 客户端输出缓冲区大小限制
    // 数组的元素有 REDIS_CLIENT_LIMIT_NUM_CLASSES 个
    // 每个代表一类客户端:普通、从服务器、pubsub,诸如此类
    clientBufferLimitsConfig client_obuf_limits[REDIS_CLIENT_LIMIT_NUM_CLASSES];
    int aof_state;                  /* AOF 状态(开启/关闭/可写) */
    int aof_fsync;                  /* 所使用的 fsync 策略(每个写入/每秒/从不) */
    char *aof_filename;             /* AOF文件名字 */
    int aof_no_fsync_on_rewrite;    /* 如果重写是在prog中,请不要fsync */
    int aof_rewrite_perc;           /* Rewrite AOF if % growth is > M and... */
    off_t aof_rewrite_base_size;    /* 最后一次执行 BGREWRITEAOF 时, AOF 文件的大小 */
    off_t aof_current_size;         /* AOF 文件的当前字节大小 */
    int aof_rewrite_scheduled;      /* BGSAVE终止后重写 */
    pid_t aof_child_pid;            /* 负责进行 AOF 重写的子进程 ID */
    list *aof_rewrite_buf_blocks;   /* AOF 重写缓存链表,链接着多个缓存块 */
    sds aof_buf;      /* AOF 缓冲区 */
    int aof_fd;       /* 当前所选AOF文件的文件描述符 */
    int aof_selected_db; /* 当前在AOF中选择的数据库 */
    time_t aof_flush_postponed_start; /*推迟AOF flush的UNIX时间 */
    time_t aof_last_fsync;            /* 最后一直执行 fsync 的时间 */
    time_t aof_rewrite_time_last;   /* 最后一次AOF重写运行所用的时间 */

    time_t aof_rewrite_time_start;  /* 当前AOF重写开始时间 */
    int aof_lastbgrewrite_status;   /* 最后一次执行 BGREWRITEAOF 的结果REDIS_OK或REDIS_ERR */
    unsigned long aof_delayed_fsync;  /* 记录 AOF 的 write 操作被推迟了多少次 */
    int aof_rewrite_incremental_fsync;/* 指示是否需要每写入一定量的数据,就主动执行一次 fsync() */
    int aof_last_write_status;      /* REDIS_OK or REDIS_ERR */
    int aof_last_write_errno;       /* 如果aof_last_write_status是ERR,则有效 */
    long long dirty;                /* 自从上次 SAVE 执行以来,数据库被修改的次数 */
    long long dirty_before_bgsave;  /* BGSAVE 执行前的数据库被修改次数 */
    pid_t rdb_child_pid;            /* 负责执行 BGSAVE 的子进程的 ID,没在执行 BGSAVE 时,设为 -1 */
    struct saveparam *saveparams;   /* 为RDB保存点数组 */
    int saveparamslen;              /* saveparams长度 */
    char *rdb_filename;             /* RDB文件的名称 */
    int rdb_compression;            /* 是否在RDB中使用压缩 */
    int rdb_checksum;               /* 是否使用RDB校验和 */
    time_t lastsave;                /* 最后一次完成 SAVE 的时间 */
    time_t lastbgsave_try;          /* 最后一次尝试执行 BGSAVE 的时间 */
    time_t rdb_save_time_last;      /* 最近一次 BGSAVE 执行耗费的时间 */
    time_t rdb_save_time_start;     /* 数据库最近一次开始执行 BGSAVE 的时间 */
    int lastbgsave_status;          /* 最后一次执行 SAVE 的状态REDIS_OK or REDIS_ERR */
    int stop_writes_on_bgsave_err;  /* 如果不能BGSAVE,不允许写入 */
    /* Propagation of commands in AOF / replication */
    redisOpArray also_propagate;    /* Additional command to propagate. */
    char *logfile;                  /* 日志文件的路径 */
    int syslog_enabled;             /* 是否启用了syslog */
    char *syslog_ident;             /* 指定syslog的标示符,如果上面的syslog-enabled no,则这个选项无效 */
    int syslog_facility;            /* 指定syslog facility,必须是USER或者LOCAL0到LOCAL7 */
    int slaveseldb;                 /* Last SELECTed DB in replication output */
    long long master_repl_offset;   /* 全局复制偏移量(一个累计值) */
    int repl_ping_slave_period;     /* Master每N秒ping一次slave */
    // backlog 本身
    char *repl_backlog;             /* Replication backlog for partial syncs */
    long long repl_backlog_size;    /* Backlog循环缓冲区大小 */
    long long repl_backlog_histlen; /* backlog 中数据的长度 */
    long long repl_backlog_idx;     /* backlog 的当前索引 */
    long long repl_backlog_off;     /* backlog 中可以被还原的第一个字节的偏移量 */
    time_t repl_backlog_time_limit; /* backlog 的过期时间 */
    time_t repl_no_slaves_since;    /* 距离上一次有从服务器的时间 */
    int repl_min_slaves_to_write;   /* 是否开启最小数量从服务器写入功能 */
    int repl_min_slaves_max_lag;    /* 定义最小数量从服务器的最大延迟值 */
    int repl_good_slaves_count;     /* 延迟良好的从服务器的数量 lag <= max_lag. */
    char *masterauth;               /* 主服务器的验证密码 */
    char *masterhost;               /* 主服务器的地址 */
    int masterport;                 /* 主服务器的端口 */
    int repl_timeout;               /* 主机空闲N秒后超时 */
    redisClient *master;     /* 主服务器所对应的客户端 */
    redisClient *cached_master; /* 被缓存的主服务器,PSYNC 时使用 */
    int repl_syncio_timeout; /* Timeout for synchronous I/O calls */
    int repl_state;          /* 复制的状态(服务器是从服务器时使用) */
    off_t repl_transfer_size; /* 在同步期间从主机读取的RDB的大小 */
    off_t repl_transfer_read; /* 在同步期间从主设备读取的RDB字节数 */
    // 最近一次执行 fsync 时的偏移量
    // 用于 sync_file_range 函数
    off_t repl_transfer_last_fsync_off; /* 上次fsync-ed时偏移 */
    int repl_transfer_s;     /* 主服务器的套接字 */
    int repl_transfer_fd;    /* 保存 RDB 文件的临时文件的描述符 */
    char *repl_transfer_tmpfile; /* 保存 RDB 文件的临时文件名字 */
    time_t repl_transfer_lastio; /* 最近一次读入 RDB 内容的时间 */
    int repl_serve_stale_data; /* Serve stale data when link is down? */
    int repl_slave_ro;          /* 从服务器是否只读 */
    time_t repl_down_since; /* 连接断开的时长 */
    int repl_disable_tcp_nodelay;   /* 是否要在 SYNC 之后关闭 NODELAY */
    int slave_priority;             /* 从服务器优先级 */
    char repl_master_runid[REDIS_RUN_ID_SIZE+1];  /*本服务器(从服务器)当前主服务器的 RUN ID */
    long long repl_master_initial_offset;         /* Master PSYNC offset. */

    /* ---------下面一些属性有些很难用到,对此我也没仔细看 */
    /* Replication script cache. */
    // 复制脚本缓存
    // 字典
    dict *repl_scriptcache_dict;        /* SHA1 all slaves are aware of. */
    // FIFO 队列
    list *repl_scriptcache_fifo;        /* First in, first out LRU eviction. */
    // 缓存的大小
    int repl_scriptcache_size;          /* Max number of elements. */

    /* Synchronous replication. */
    list *clients_waiting_acks;         /* Clients waiting in WAIT command. */
    int get_ack_from_slaves;            /* If true we send REPLCONF GETACK. */
    int maxclients;                 /* 最大并发客户端数 */
    unsigned long long maxmemory;   /* 要使用的最大内存字节数 */
    int maxmemory_policy;           /* Policy for key eviction */
    int maxmemory_samples;          /* Pricision of random sampling */
    unsigned int bpop_blocked_clients; /* 列表阻止的客户端数量 */
    list *unblocked_clients; /* 在下一个循环之前解锁的客户端列表 */
    list *ready_keys;        /* List of readyList structures for BLPOP & co */


    /* Sort parameters - qsort_r() is only available under BSD so we
     * have to take this state global, in order to pass it to sortCompare() */
    int sort_desc;
    int sort_alpha;
    int sort_bypattern;
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/939485
推荐阅读
相关标签
  

闽ICP备14008679号