/* Start interactive mode when no command is provided */ if (argc == 0 && !config.eval) { /* Ignore SIGPIPE in interactive mode to force a reconnect */ signal(SIGPIPE, SIG_IGN);
/* Note that in repl mode we don't abort on connection error. * A new attempt will be performed for every command send. */ cliConnect(0); repl(); }
typedefstructredisContext { int err; /* Error flags, 0 when there is no error */ char errstr[128]; /* String representation of error when applicable */ int fd; // socket句柄,用户连接redis server int flags; char *obuf; /* Write buffer *///主要存储发送的命令,resp协议封装后的sds redisReader *reader; /* Protocol reader */// 存储server返回的数据
issueCommandRepeat cliSendCommand redisAppendCommandArgv redisFormatSdsCommandArgv __redisAppendCommand 源码: sds cmd; int len;
//redisFormatSdsCommandArgv是将命令极其跟随的参数,使用resp协议封装后,存到一个sds结构中。 len = redisFormatSdsCommandArgv(&cmd,argc,argv,argvlen); if (len == -1) { __redisSetError(c,REDIS_ERR_OOM,"Out of memory"); return REDIS_ERR; }
//__redisAppendCommand是将sds保存的resp协议的数据存到redisContext中的obuf中 if (__redisAppendCommand(c,cmd,len) != REDIS_OK) { sdsfree(cmd); return REDIS_ERR; }
while(repeat-- > 0) { redisAppendCommandArgv(context,argc,(constchar**)argv,argvlen); while (config.monitor_mode) { if (cliReadReply(output_raw) != REDIS_OK) exit(1); fflush(stdout); }
if (config.pubsub_mode) { if (config.output != OUTPUT_RAW) printf("Reading messages... (press Ctrl-C to quit)\n"); while (1) { if (cliReadReply(output_raw) != REDIS_OK) exit(1); } }
if (config.slave_mode) { printf("Entering replica output mode... (press Ctrl-C to quit)\n"); slaveMode(); config.slave_mode = 0; zfree(argvlen); return REDIS_ERR; /* Error = slaveMode lost connection to master */ }
if (cliReadReply(output_raw) != REDIS_OK) { zfree(argvlen); return REDIS_ERR; } else { /* Store database number when SELECT was successfully executed. */ if (!strcasecmp(command,"select") && argc == 2 && config.last_cmd_type != REDIS_REPLY_ERROR) { config.dbnum = atoi(argv[1]); cliRefreshPrompt(); } elseif (!strcasecmp(command,"auth") && argc == 2) { cliSelect(); } } if (config.interval) usleep(config.interval); fflush(stdout); /* Make it grep friendly */ }