stCreate();
10 server.monitors = listCreate();
11 server.clients_pending_write = listCreate();
12 server.slaveseldb = -1; /* Force to emit the first SELECT command. */
13 server.unblocked_clients = listCreate();
14 server.ready_keys = listCreate();
15 server.clients_waiting_acks = listCreate();
16 server.get_ack_from_slaves = 0;
17 server.clients_paused = 0;
18 server.system_memory_size = zmalloc_get_memory_size();
19 //创建常用字符串,比如命令回复pong及命令字符串等
20 createSharedObjects();
21 //根据配置的最大连接客户端数和CONFIG_MIN_RESERVED_FDS(用于监听、日志文件等文件描述符)设置最大允许打开的文件描述符数
22 adjustOpenFilesLimit();
23 //初始化aeEventLoop对象并赋值给server中的指针变量el
24 server.el = aeCreateEventLoop(server.maxclients+CONFIG_FDSET_INCR);
25 server.db = zmalloc(sizeof(redisDb)*server.dbnum);
26
27 /* Open the TCP listening socket for the user commands. */
28 //用于创建监听文件描述符
29 if (server.port != 0 &&
30 listenToPort(server.port,server.ipfd,&server.ipfd_count) == C_ERR)
31 exit(1);
32
33 /* Create the Redis databases, and initialize other internal state. */
34 for (j = 0; j < server.dbnum; j++) {
35 server.db[j].dict = dictCreate(&dbDictType,NULL);
36 server.db[j].expires = dictCreate(&keyptrDictType,NULL);
37 server.db[j].blocking_keys = dictCreate(&keylistDictType,NULL);
38 server.db[j].ready_keys = dictCreate(&objectKeyPointerValueDictType,NULL);
39 server.db[j].watched_keys = dictCreate(&keylistDictType,NULL);
40 server.db[j].id = j;
41 server.db[j].avg_ttl = 0;
42 server.db[j].defrag_later = listCreate();
43 }
44 //创建lru池,内存超过设置的值时,根据淘汰策略,清除部分key
45 evictionPoolAlloc(); /* Initialize the LRU keys pool. */
46 server.pubsub_channels = dictCreate(&keylistDictType,NULL);
47 server.pubsub_patterns = listCreate();
48 listSetFreeMethod(server.pubsub_patterns,freePubsubPattern);
49 listSetMatchMethod(server.pubsub_patterns,listMatchPubsubPattern);
50 server.cronloops = 0;
51 server.rdb_child_pid = -1;
52 server.aof_child_pid = -1;
53 server.rdb_child_type = RDB_CHILD_TYPE_NONE;
54 server.rdb_bgsave_scheduled = 0;
55 server.child_info_pipe[0] = -1;
56 server.child_info_pipe[1] = -1;
57 server.child_info_data.magic = 0;
58 aofRewriteBufferReset();
59 server.aof_buf = sdsempty();
60 server.lastsave = time(NULL); /* At startup we consider the DB saved. */
61 server.lastbgsave_try = 0; /* At startup we never tried to BGSAVE. */
62 server.rdb_save_time_last = -1;
63 server.rdb_save_time_start = -1;
64 server.dirty = 0;
65 resetServerStats();
66 /* A few stats we don't want to reset: server startup time, and peak mem. */
67 server.stat_starttime = time(NULL);
68 server.stat_peak_memory = 0;
69 server.stat_rdb_cow_bytes = 0;
70 server.stat_aof_cow_bytes = 0;
71 server.cron_malloc_stats.zmalloc_used = 0;
72 server.cron_malloc_stats.process_rss = 0;
73 server.cron_malloc_stats.allocator_allocated = 0;
74 server.cron_malloc_stats.allocator_active = 0;
75 server.cron_malloc_stats.allocator_resident = 0;
76 server.lastbgsave_status = C_OK;
77 server.aof_last_write_status = C_OK;
78 server.aof_last_write_errno = 0;
79 server.repl_good_slaves_count = 0;
80
81 /* Create the timer callback, this is our way to process many background
82 * operations incrementally, like clients ti |