阅读 Redis 源码

服务端

首先找到服务端主入口,在 server.c 文件的 int main(int argc, char **argv)

首先定义了时间变量 tv,类型是结构体 timeval,来源于 #include <sys/time.h>

#ifdef 是编译用的,如果满足条件就编译;否则不编译。

设置本地化参数。

设置 zmalloc (申请内存的工具,代替 malloc) 内存溢出的错误处理函数。

srand() 用来设置 rand() 产生随机数时的随机数种子

gettimeofday 给 tv 变量设置当前时间。

用 hashseed 设置 Dic Set 的 Seed

检查服务器启动参数是否开启了哨兵模式,并设置服务器的哨兵模式。

初始化服务器配置

设置时间到 server 结构体,缓存起来。

变量配置常量配置默认值作用
runid
configfileNULL配置文件路径
executableNULL可执行文件路径
timezone设置时区。如果是 LINUX,则使用 time.h 的 timezone。否则使用 gettimeofday 获取时区。
hz设置 serverCron() 调用频率,单位 hz(hertz)。默认十次/秒。
dynamic_hzCONFIG_DEFAULT_DYNAMIC_HZ客户端设置 hz 变量。
arch_bitsCPU 位数
portCONFIG_DEFAULT_SERVER_PORT设置端口
tcp_backlogCONFIG_DEFAULT_TCP_BACKLOG
bindaddr_count0绑定地址个数
unix_socketNULL
unix_socketpermCONFIG_DEFAULT_UNIX_SOCKET_PERM0权限
ipfd_countip 文件描述符数量
sofd-1socket 文件描述符
protected_modeCONFIG_DEFAULT_PROTECTED_MODE1根据配置设置保护模式,不接收外部连接
gopher_enabledCONFIG_DEFAULT_GOPHER_ENABLED0不知道是啥
dbnumCONFIG_DEFAULT_DBNUM16设置数据库个数,用于存储 key-value
verbosityCONFIG_DEFAULT_VERBOSITYLL_NOTICE设置日志是否记录更多内容
maxidletimeCONFIG_DEFAULT_CLIENT_TIMEOUT0客户端最大空闲时间(超时时间)
tcpkeepaliveCONFIG_DEFAULT_TCP_KEEPALIVE300TCP 连接保活时间
active_expire_enabled1
active_defrag_enabledCONFIG_DEFAULT_ACTIVE_DEFRAG0
active_defrag_ignore_bytesCONFIG_DEFAULT_DEFRAG_IGNORE_BYTES100«20
active_defrag_threshold_lowerCONFIG_DEFAULT_DEFRAG_THRESHOLD_LOWER10
active_defrag_threshold_upperCONFIG_DEFAULT_DEFRAG_THRESHOLD_UPPER100
active_defrag_cycle_minCONFIG_DEFAULT_DEFRAG_CYCLE_MIN5
active_defrag_cycle_maxCONFIG_DEFAULT_DEFRAG_CYCLE_MAX75
active_defrag_max_scan_fieldsCONFIG_DEFAULT_DEFRAG_MAX_SCAN_FIELDS1000
proto_max_bulk_lenCONFIG_DEFAULT_PROTO_MAX_BULK_LEN21211*1024*1024协议桶最大长度
client_max_querybuf_lenPROTO_MAX_QUERYBUF_LEN102410241024客户端最大查询缓冲区长度
saveparamsNULL为RDB保存点数组
loading0是否正在从磁盘加载数据
logfileCONFIG_DEFAULT_LOGFILE""日志文件路径
syslog_enabledCONFIG_DEFAULT_SYSLOG_ENABLED0使用系统日志
syslog_identCONFIG_DEFAULT_SYSLOG_IDENT“redis”
syslog_facilityLOG_LOCAL016«3
daemonizeCONFIG_DEFAULT_DAEMONIZE0是否放后台运行 Redis
supervised0
supervised_modeSUPERVISED_NONE0

AOF(Append Only File),持久化方案之一。将每一个数据操作记录到文件中。体积过大时会对其进行重写。

官方文档: https://redis.io/topics/persistence

变量配置常量配置默认值作用
aof_stateAOF_(ON|OFF|WAIT_REWRITE)0(AOF_OFF)是否开启 AOF
aof_fsyncCONFIG_DEFAULT_AOF_FSYNC2(AOF_FSYNC_EVERYSEC) 或者 0(AOF_FSYNC_NO) 或者 1(AOF_FSYNC_ALWAYS)
aof_no_fsync_on_rewriteCONFIG_DEFAULT_AOF_NO_FSYNC_ON_REWRITE
aof_rewrite_percAOF_REWRITE_PERC
aof_rewrite_min_sizeAOF_REWRITE_MIN_SIZE
aof_rewrite_base_size
aof_rewrite_scheduled
aof_last_fsync
aof_rewrite_time_last
aof_rewrite_time_start
aof_lastbgrewrite_status
aof_delayed_fsync
aof_fd
aof_selected_db
aof_flush_postponed_start
aof_rewrite_incremental_fsyncCONFIG_DEFAULT_AOF_REWRITE_INCREMENTAL_FSYNC
aof_load_truncatedCONFIG_DEFAULT_AOF_LOAD_TRUNCATED
aof_use_rdb_preambleCONFIG_DEFAULT_AOF_USE_RDB_PREAMBLE
aof_filenameCONFIG_DEFAULT_AOF_FILENAME

RDB(Redis Database),持久化方案之一。将 Redis 在内存中的数据建立一份快照(Snapshot),存储到文件中。

官方文档: https://redis.io/topics/persistence

变量配置常量配置默认值作用
rdb_save_incremental_fsyncCONFIG_DEFAULT_RDB_SAVE_INCREMENTAL_FSYNC1增量存储数据。不是一次性把所有数据准备好再写入文件,而是每生成 32MB 数据,就写一次文件。
rdb_filenameCONFIG_DEFAULT_RDB_FILENAME“dump.rdb”RDB 保存的文件名
rdb_compressionCONFIG_DEFAULT_RDB_COMPRESSION1是否对数据启用压缩
rdb_checksumCONFIG_DEFAULT_RDB_CHECKSUM1是否开启校验和