首先初始化默認配置
變量 |
默認值 |
server.runid |
d3d11e6a9a2ee8876697355a44117dfcfe87fce3 |
server.configfile |
NULL |
server.hz |
10 |
server.arch_bits |
64 |
server.port |
6379 |
server.tcp_backlog |
511 |
server.bindaddr_count |
0 |
server.unixsocket |
NULL |
server.unixsocketperm |
0 |
server.ipfd_count |
0 |
server.sofd |
-1 |
server.dbnum |
16 |
server.verbosity |
REDIS_NOTICE |
server.maxidletime |
0 |
server.tcpkeepalive |
0 |
server.logfile |
“” |
server.syslog_enabled |
0 |
server.syslog_identa |
redis |
server.syslog_facility |
LOG_LOCAL0 |
server.aof_state |
0 |
server.aof_fsync |
2 |
server.aof_no_fsync_on_rewrite |
0 |
server.aof_rewrite_perc |
100 |
server.aof_rewrite_min_size |
64*1024*1024 |
server.aof_rewrite_base_size |
0 |
server.aof_rewrite_scheduled |
0 |
server.aof_last_fsync |
time(NULL) |
server.aof_rewrite_time_last |
-1 |
server.aof_rewrite_time_start |
-1 |
server.aof_lastbgrewrite_status |
0 |
server.aof_delayed_fsync |
0 |
server.aof_fd |
-1 |
server.aof_selected_db |
-1 |
server.aof_flush_postponed_start |
0 |
server.aof_rewrite_incremental_fsync |
1 |
其中populateCommandTable 函數主要是對redisCommandTable hash(command name -> command struct)到server.commands
void populateCommandTable(void) {
int j;
int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);
//遍歷redisCommandTable
for (j = 0; j < numcommands; j++) {
struct redisCommand *c = redisCommandTable+j;
char *f = c->sflags;
int retval1, retval2;
//command flags 轉換
while(*f != '\0') {
switch(*f) {
case 'w': c->flags |= REDIS_CMD_WRITE; break;
case 'r': c->flags |= REDIS_CMD_READONLY; break;
case 'm': c->flags |= REDIS_CMD_DENYOOM; break;
case 'a': c->flags |= REDIS_CMD_ADMIN; break;
case 'p': c->flags |= REDIS_CMD_PUBSUB; break;
case 's': c->flags |= REDIS_CMD_NOSCRIPT; break;
case 'R': c->flags |= REDIS_CMD_RANDOM; break;
case 'S': c->flags |= REDIS_CMD_SORT_FOR_SCRIPT; break;
case 'l': c->flags |= REDIS_CMD_LOADING; break;
case 't': c->flags |= REDIS_CMD_STALE; break;
case 'M': c->flags |= REDIS_CMD_SKIP_MONITOR; break;
case 'k': c->flags |= REDIS_CMD_ASKING; break;
case 'F': c->flags |= REDIS_CMD_FAST; break;
default: redisPanic("Unsupported command flag"); break;
}
f++;
}
//加入到server.commands hash table. Hash table 數據結構後面會有講到
retval1 = dictAdd(server.commands, sdsnew(c->name), c);
/* Populate an additional dictionary that will be unaffected
* by rename-command statements in redis.conf. */
retval2 = dictAdd(server.orig_commands, sdsnew(c->name), c);
redisAssert(retval1 == DICT_OK && retval2 == DICT_OK);
}
}
其中redisCommandTable是已經初始化好的commands 數組
struct redisCommand redisCommandTable[] = {
{"get",getCommand,2,"rF",0,NULL,1,1,1,0,0},
{"set",setCommand,-3,"wm",0,NULL,1,1,1,0,0},
{"setnx",setnxCommand,3,"wmF",0,NULL,1,1,1,0,0},
{"setex",setexCommand,4,"wm",0,NULL,1,1,1,0,0},
{"psetex",psetexCommand,4,"wm",0,NULL,1,1,1,0,0},
{"append",appendCommand,3,"wm",0,NULL,1,1,1,0,0},
{"strlen",strlenCommand,2,"rF",0,NULL,1,1,1,0,0},
{"del",delCommand,-2,"w",0,NULL,1,-1,1,0,0},
{"exists",existsCommand,-2,"rF",0,NULL,1,-1,1,0,0},
{"setbit",setbitCommand,4,"wm",0,NULL,1,1,1,0,0},
{"getbit",getbitCommand,3,"rF",0,NULL,1,1,1,0,0},
{"setrange",setrangeCommand,4,"wm",0,NULL,1,1,1,0,0},
{"getrange",getrangeCommand,4,"r",0,NULL,1,1,1,0,0},
{"substr",getrangeCommand,4,"r",0,NULL,1,1,1,0,0},
{"incr",incrCommand,2,"wmF",0,NULL,1,1,1,0,0},...}