int hostport;
char *hostsocket;
long repeat;
+ long interval;
int dbnum;
int interactive;
int shutdown;
int monitor_mode;
int pubsub_mode;
+ int latency_mode;
int stdinarg; /* get last arg from stdin. (-x option) */
char *auth;
int raw_output; /* output mode per command */
cliRefreshPrompt();
}
}
+ if (config.interval) usleep(config.interval);
+ fflush(stdout); /* Make it grep friendly */
}
free(argvlen);
} else if (!strcmp(argv[i],"-r") && !lastarg) {
config.repeat = strtoll(argv[i+1],NULL,10);
i++;
+ } else if (!strcmp(argv[i],"-i") && !lastarg) {
+ double seconds = atof(argv[i+1]);
+ config.interval = seconds*1000000;
+ i++;
} else if (!strcmp(argv[i],"-n") && !lastarg) {
config.dbnum = atoi(argv[i+1]);
i++;
i++;
} else if (!strcmp(argv[i],"--raw")) {
config.raw_output = 1;
+ } else if (!strcmp(argv[i],"--latency")) {
+ config.latency_mode = 1;
} else if (!strcmp(argv[i],"-d") && !lastarg) {
sdsfree(config.mb_delim);
config.mb_delim = sdsnew(argv[i+1]);
" -s <socket> Server socket (overrides hostname and port)\n"
" -a <password> Password to use when connecting to the server\n"
" -r <repeat> Execute specified command N times\n"
+" -i <interval> When -r is used, waits <interval> seconds per command.\n"
+" It is possible to specify sub-second times like -i 0.1.\n"
" -n <db> Database number\n"
" -x Read last argument from STDIN\n"
" -d <delimiter> Multi-bulk delimiter in for raw formatting (default: \\n)\n"
" --raw Use raw formatting for replies (default when STDOUT is not a tty)\n"
+" --latency Enter a special mode continuously sampling latency.\n"
" --help Output this help and exit\n"
" --version Output version and exit\n"
"\n"
" cat /etc/passwd | redis-cli -x set mypasswd\n"
" redis-cli get mypasswd\n"
" redis-cli -r 100 lpush mylist x\n"
+" redis-cli -r 100 -i 1 info | grep used_memory_human:\n"
"\n"
"When no command is given, redis-cli starts in interactive mode.\n"
"Type \"help\" in interactive mode for information on available commands.\n"
int repeat, skipargs = 0;
repeat = atoi(argv[0]);
- if (repeat) {
+ if (argc > 1 && repeat) {
skipargs = 1;
} else {
repeat = 1;
/* If we still cannot send the command print error.
* We'll try to reconnect the next time. */
- if (cliSendCommand(argc,argv,1) != REDIS_OK)
+ if (cliSendCommand(argc-skipargs,argv+skipargs,repeat)
+ != REDIS_OK)
cliPrintContextError();
}
elapsed = mstime()-start_time;
return retval;
}
+static void latencyMode(void) {
+ redisReply *reply;
+ long long start, latency, min, max, tot, count = 0;
+ double avg;
+
+ if (!context) exit(1);
+ while(1) {
+ start = mstime();
+ reply = redisCommand(context,"PING");
+ if (reply == NULL) {
+ fprintf(stderr,"\nI/O error\n");
+ exit(1);
+ }
+ latency = mstime()-start;
+ freeReplyObject(reply);
+ count++;
+ if (count == 1) {
+ min = max = tot = latency;
+ avg = (double) latency;
+ } else {
+ if (latency < min) min = latency;
+ if (latency > max) max = latency;
+ tot += latency;
+ avg = (double) tot/count;
+ }
+ printf("\x1b[0G\x1b[2Kmin: %lld, max: %lld, avg: %.2f (%lld samples)",
+ min, max, avg, count);
+ fflush(stdout);
+ usleep(10000);
+ }
+}
+
int main(int argc, char **argv) {
int firstarg;
config.hostport = 6379;
config.hostsocket = NULL;
config.repeat = 1;
+ config.interval = 0;
config.dbnum = 0;
config.interactive = 0;
config.shutdown = 0;
config.monitor_mode = 0;
config.pubsub_mode = 0;
+ config.latency_mode = 0;
config.stdinarg = 0;
config.auth = NULL;
config.raw_output = !isatty(fileno(stdout)) && (getenv("FAKETTY") == NULL);
argc -= firstarg;
argv += firstarg;
+ /* Start in latency mode if appropriate */
+ if (config.latency_mode) {
+ cliConnect(0);
+ latencyMode();
+ }
+
/* Start interactive mode when no command is provided */
if (argc == 0) {
/* Note that in repl mode we don't abort on connection error.