X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/4d19e3443cc3a36bd51684099152d89e18c45afa..f96a8a8054b3b699c2fba797bdcd203dda1168ce:/src/redis-cli.c diff --git a/src/redis-cli.c b/src/redis-cli.c index 650eafe3..b129df61 100644 --- a/src/redis-cli.c +++ b/src/redis-cli.c @@ -55,11 +55,13 @@ static struct config { 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 */ @@ -517,6 +519,8 @@ static int cliSendCommand(int argc, char **argv, int repeat) { cliRefreshPrompt(); } } + if (config.interval) usleep(config.interval); + fflush(stdout); /* Make it grep friendly */ } free(argvlen); @@ -552,6 +556,10 @@ static int parseOptions(int argc, char **argv) { } 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++; @@ -560,6 +568,8 @@ static int parseOptions(int argc, char **argv) { 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]); @@ -604,10 +614,13 @@ static void usage() { " -s Server socket (overrides hostname and port)\n" " -a Password to use when connecting to the server\n" " -r Execute specified command N times\n" +" -i When -r is used, waits seconds per command.\n" +" It is possible to specify sub-second times like -i 0.1.\n" " -n Database number\n" " -x Read last argument from STDIN\n" " -d 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" @@ -615,6 +628,7 @@ static void usage() { " 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" @@ -683,7 +697,7 @@ static void repl() { int repeat, skipargs = 0; repeat = atoi(argv[0]); - if (repeat) { + if (argc > 1 && repeat) { skipargs = 1; } else { repeat = 1; @@ -696,7 +710,8 @@ static void repl() { /* 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; @@ -728,6 +743,38 @@ static int noninteractive(int argc, char **argv) { 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; @@ -735,11 +782,13 @@ int main(int argc, char **argv) { 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); @@ -750,6 +799,12 @@ int main(int argc, char **argv) { 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.