2009-03-22 05:30:00 -04:00
/* Redis benchmark utility.
*
2010-02-19 05:23:57 -05:00
* Copyright ( c ) 2009 - 2010 , Salvatore Sanfilippo < antirez at gmail dot com >
2009-03-22 05:30:00 -04:00
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
*
* * Redistributions of source code must retain the above copyright notice ,
* this list of conditions and the following disclaimer .
* * Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* * Neither the name of Redis nor the names of its contributors may be used
* to endorse or promote products derived from this software without
* specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS "
* AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR
* CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS
* INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN
* CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE )
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE .
*/
2009-05-19 12:39:58 -04:00
# include "fmacros.h"
2009-03-22 05:30:00 -04:00
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <unistd.h>
# include <errno.h>
# include <sys/time.h>
# include <signal.h>
# include <assert.h>
# include "ae.h"
2010-11-04 08:37:05 -04:00
# include "hiredis.h"
2009-03-22 05:30:00 -04:00
# include "sds.h"
# include "adlist.h"
# include "zmalloc.h"
# define CLIENT_CONNECTING 0
# define CLIENT_SENDQUERY 1
# define CLIENT_READREPLY 2
# define REDIS_NOTUSED(V) ((void) V)
static struct config {
2009-11-19 07:08:54 -05:00
int debug ;
2009-03-22 05:30:00 -04:00
int numclients ;
int requests ;
int liveclients ;
int donerequests ;
int keysize ;
int datasize ;
2009-05-09 03:25:59 -04:00
int randomkeys ;
2009-05-10 18:36:12 -04:00
int randomkeys_keyspacelen ;
2009-03-22 05:30:00 -04:00
aeEventLoop * el ;
char * hostip ;
int hostport ;
2010-08-01 16:55:24 -04:00
char * hostsocket ;
2009-03-22 05:30:00 -04:00
int keepalive ;
long long start ;
long long totlatency ;
2010-11-04 09:47:15 -04:00
long long * latency ;
2010-08-30 05:25:02 -04:00
char * title ;
2009-03-22 05:30:00 -04:00
list * clients ;
int quiet ;
int loop ;
2009-11-23 12:50:39 -05:00
int idlemode ;
2009-03-22 05:30:00 -04:00
} config ;
typedef struct _client {
2010-11-04 08:37:05 -04:00
redisContext * context ;
2009-03-22 05:30:00 -04:00
int state ;
sds obuf ;
2010-12-23 05:04:44 -05:00
char * randptr [ 10 ] ; /* needed for MSET against 10 keys */
size_t randlen ;
2010-11-04 09:47:15 -04:00
unsigned int written ; /* bytes of 'obuf' already written */
long long start ; /* start time of a request */
long long latency ; /* request latency */
2009-03-22 05:30:00 -04:00
} * client ;
/* Prototypes */
static void writeHandler ( aeEventLoop * el , int fd , void * privdata , int mask ) ;
static void createMissingClients ( client c ) ;
/* Implementation */
2010-11-04 09:47:15 -04:00
static long long ustime ( void ) {
struct timeval tv ;
long long ust ;
gettimeofday ( & tv , NULL ) ;
ust = ( ( long ) tv . tv_sec ) * 1000000 ;
ust + = tv . tv_usec ;
return ust ;
}
2009-03-22 05:30:00 -04:00
static long long mstime ( void ) {
struct timeval tv ;
long long mst ;
gettimeofday ( & tv , NULL ) ;
mst = ( ( long ) tv . tv_sec ) * 1000 ;
mst + = tv . tv_usec / 1000 ;
return mst ;
}
static void freeClient ( client c ) {
listNode * ln ;
2010-11-04 08:37:05 -04:00
aeDeleteFileEvent ( config . el , c - > context - > fd , AE_WRITABLE ) ;
aeDeleteFileEvent ( config . el , c - > context - > fd , AE_READABLE ) ;
redisFree ( c - > context ) ;
2009-03-22 05:30:00 -04:00
sdsfree ( c - > obuf ) ;
zfree ( c ) ;
config . liveclients - - ;
ln = listSearchKey ( config . clients , c ) ;
assert ( ln ! = NULL ) ;
listDelNode ( config . clients , ln ) ;
}
static void freeAllClients ( void ) {
listNode * ln = config . clients - > head , * next ;
while ( ln ) {
next = ln - > next ;
freeClient ( ln - > value ) ;
ln = next ;
}
}
static void resetClient ( client c ) {
2010-11-04 08:37:05 -04:00
aeDeleteFileEvent ( config . el , c - > context - > fd , AE_WRITABLE ) ;
aeDeleteFileEvent ( config . el , c - > context - > fd , AE_READABLE ) ;
aeCreateFileEvent ( config . el , c - > context - > fd , AE_WRITABLE , writeHandler , c ) ;
2009-03-22 05:30:00 -04:00
c - > written = 0 ;
c - > state = CLIENT_SENDQUERY ;
2010-11-04 09:47:15 -04:00
c - > start = ustime ( ) ;
c - > latency = - 1 ;
2009-03-22 05:30:00 -04:00
}
2009-05-10 18:36:12 -04:00
static void randomizeClientKey ( client c ) {
char buf [ 32 ] ;
2010-12-23 05:04:44 -05:00
size_t i , r ;
2009-05-10 18:36:12 -04:00
2010-12-23 05:04:44 -05:00
for ( i = 0 ; i < c - > randlen ; i + + ) {
r = random ( ) % config . randomkeys_keyspacelen ;
snprintf ( buf , sizeof ( buf ) , " %012lu " , r ) ;
memcpy ( c - > randptr [ i ] , buf , 12 ) ;
2010-12-16 18:19:32 -05:00
}
2009-05-10 18:36:12 -04:00
}
2009-03-22 05:30:00 -04:00
static void clientDone ( client c ) {
if ( config . donerequests = = config . requests ) {
freeClient ( c ) ;
aeStop ( config . el ) ;
return ;
}
if ( config . keepalive ) {
resetClient ( c ) ;
2009-05-10 18:36:12 -04:00
if ( config . randomkeys ) randomizeClientKey ( c ) ;
2009-03-22 05:30:00 -04:00
} else {
config . liveclients - - ;
createMissingClients ( c ) ;
config . liveclients + + ;
freeClient ( c ) ;
}
}
2010-11-04 08:37:05 -04:00
static void readHandler ( aeEventLoop * el , int fd , void * privdata , int mask ) {
2009-03-22 05:30:00 -04:00
client c = privdata ;
2010-11-04 08:37:05 -04:00
void * reply = NULL ;
2009-03-22 05:30:00 -04:00
REDIS_NOTUSED ( el ) ;
REDIS_NOTUSED ( fd ) ;
REDIS_NOTUSED ( mask ) ;
2010-11-04 09:47:15 -04:00
/* Calculate latency only for the first read event. This means that the
* server already sent the reply and we need to parse it . Parsing overhead
* is not part of the latency , so calculate it only once , here . */
if ( c - > latency < 0 ) c - > latency = ustime ( ) - ( c - > start ) ;
2010-11-04 08:37:05 -04:00
if ( redisBufferRead ( c - > context ) ! = REDIS_OK ) {
fprintf ( stderr , " Error: %s \n " , c - > context - > errstr ) ;
exit ( 1 ) ;
} else {
if ( redisGetReply ( c - > context , & reply ) ! = REDIS_OK ) {
fprintf ( stderr , " Error: %s \n " , c - > context - > errstr ) ;
exit ( 1 ) ;
2009-11-17 10:57:35 -05:00
}
2010-11-04 09:47:15 -04:00
if ( reply ! = NULL ) {
2010-12-16 17:35:02 -05:00
if ( reply = = ( void * ) REDIS_REPLY_ERROR ) {
fprintf ( stderr , " Unexpected error reply, exiting... \n " ) ;
exit ( 1 ) ;
}
2010-11-04 09:47:15 -04:00
if ( config . donerequests < config . requests )
config . latency [ config . donerequests + + ] = c - > latency ;
2010-11-04 08:37:05 -04:00
clientDone ( c ) ;
2010-11-04 09:47:15 -04:00
}
2009-11-17 10:57:35 -05:00
}
2009-03-22 05:30:00 -04:00
}
2010-11-04 08:37:05 -04:00
static void writeHandler ( aeEventLoop * el , int fd , void * privdata , int mask ) {
2009-03-22 05:30:00 -04:00
client c = privdata ;
REDIS_NOTUSED ( el ) ;
REDIS_NOTUSED ( fd ) ;
REDIS_NOTUSED ( mask ) ;
if ( c - > state = = CLIENT_CONNECTING ) {
c - > state = CLIENT_SENDQUERY ;
2010-11-04 09:47:15 -04:00
c - > start = ustime ( ) ;
c - > latency = - 1 ;
2009-03-22 05:30:00 -04:00
}
if ( sdslen ( c - > obuf ) > c - > written ) {
void * ptr = c - > obuf + c - > written ;
2010-11-04 08:37:05 -04:00
int nwritten = write ( c - > context - > fd , ptr , sdslen ( c - > obuf ) - c - > written ) ;
2009-03-22 05:30:00 -04:00
if ( nwritten = = - 1 ) {
2009-12-11 18:04:20 -05:00
if ( errno ! = EPIPE )
fprintf ( stderr , " Writing to socket: %s \n " , strerror ( errno ) ) ;
2009-03-22 05:30:00 -04:00
freeClient ( c ) ;
return ;
}
c - > written + = nwritten ;
if ( sdslen ( c - > obuf ) = = c - > written ) {
2010-11-04 08:37:05 -04:00
aeDeleteFileEvent ( config . el , c - > context - > fd , AE_WRITABLE ) ;
aeCreateFileEvent ( config . el , c - > context - > fd , AE_READABLE , readHandler , c ) ;
2009-03-22 05:30:00 -04:00
c - > state = CLIENT_READREPLY ;
}
}
}
2010-12-23 05:04:44 -05:00
static client createClient ( char * cmd , int len ) {
2009-03-22 05:30:00 -04:00
client c = zmalloc ( sizeof ( struct _client ) ) ;
2010-11-04 08:37:05 -04:00
if ( config . hostsocket = = NULL ) {
c - > context = redisConnectNonBlock ( config . hostip , config . hostport ) ;
} else {
c - > context = redisConnectUnixNonBlock ( config . hostsocket ) ;
2009-03-22 05:30:00 -04:00
}
2010-11-04 08:37:05 -04:00
if ( c - > context - > err ) {
fprintf ( stderr , " Could not connect to Redis at " ) ;
if ( config . hostsocket = = NULL )
fprintf ( stderr , " %s:%d: %s \n " , config . hostip , config . hostport , c - > context - > errstr ) ;
else
fprintf ( stderr , " %s: %s \n " , config . hostsocket , c - > context - > errstr ) ;
exit ( 1 ) ;
}
c - > state = CLIENT_CONNECTING ;
2010-12-23 05:04:44 -05:00
c - > obuf = sdsnewlen ( cmd , len ) ;
c - > randlen = 0 ;
2009-03-22 05:30:00 -04:00
c - > written = 0 ;
2010-12-23 05:04:44 -05:00
/* Find substrings in the output buffer that need to be randomized. */
if ( config . randomkeys ) {
char * p = c - > obuf , * newline ;
while ( ( p = strstr ( p , " :rand: " ) ) ! = NULL ) {
newline = strstr ( p , " \r \n " ) ;
assert ( newline - ( p + 6 ) = = 12 ) ; /* 12 chars for randomness */
assert ( c - > randlen < ( signed ) ( sizeof ( c - > randptr ) / sizeof ( char * ) ) ) ;
c - > randptr [ c - > randlen + + ] = p + 6 ;
p = newline + 2 ;
}
}
2010-11-04 08:37:05 -04:00
redisSetReplyObjectFunctions ( c - > context , NULL ) ;
aeCreateFileEvent ( config . el , c - > context - > fd , AE_WRITABLE , writeHandler , c ) ;
2009-03-22 05:30:00 -04:00
listAddNodeTail ( config . clients , c ) ;
2010-11-04 08:37:05 -04:00
config . liveclients + + ;
2009-03-22 05:30:00 -04:00
return c ;
}
static void createMissingClients ( client c ) {
2010-12-18 04:58:50 -05:00
int n = 0 ;
2009-03-22 05:30:00 -04:00
while ( config . liveclients < config . numclients ) {
2010-12-23 05:04:44 -05:00
client new = createClient ( c - > obuf , sdslen ( c - > obuf ) ) ;
if ( config . randomkeys ) randomizeClientKey ( new ) ;
2010-12-18 04:58:50 -05:00
/* Listen backlog is quite limited on most systems */
if ( + + n > 64 ) {
usleep ( 50000 ) ;
n = 0 ;
}
2009-03-22 05:30:00 -04:00
}
}
2010-11-04 09:47:15 -04:00
static int compareLatency ( const void * a , const void * b ) {
return ( * ( long long * ) a ) - ( * ( long long * ) b ) ;
}
2010-08-30 05:25:02 -04:00
static void showLatencyReport ( void ) {
2010-11-04 09:47:15 -04:00
int i , curlat = 0 ;
2009-03-22 05:30:00 -04:00
float perc , reqpersec ;
reqpersec = ( float ) config . donerequests / ( ( float ) config . totlatency / 1000 ) ;
if ( ! config . quiet ) {
2010-08-30 05:25:02 -04:00
printf ( " ====== %s ====== \n " , config . title ) ;
2009-03-22 05:30:00 -04:00
printf ( " %d requests completed in %.2f seconds \n " , config . donerequests ,
( float ) config . totlatency / 1000 ) ;
printf ( " %d parallel clients \n " , config . numclients ) ;
printf ( " %d bytes payload \n " , config . datasize ) ;
printf ( " keep alive: %d \n " , config . keepalive ) ;
printf ( " \n " ) ;
2010-11-04 09:47:15 -04:00
qsort ( config . latency , config . requests , sizeof ( long long ) , compareLatency ) ;
for ( i = 0 ; i < config . requests ; i + + ) {
if ( config . latency [ i ] / 1000 ! = curlat | | i = = ( config . requests - 1 ) ) {
curlat = config . latency [ i ] / 1000 ;
perc = ( ( float ) ( i + 1 ) * 100 ) / config . requests ;
printf ( " %.2f%% <= %d milliseconds \n " , perc , curlat ) ;
2009-03-22 05:30:00 -04:00
}
}
printf ( " %.2f requests per second \n \n " , reqpersec ) ;
} else {
2010-08-30 05:25:02 -04:00
printf ( " %s: %.2f requests per second \n " , config . title , reqpersec ) ;
2009-03-22 05:30:00 -04:00
}
}
2010-12-22 12:31:33 -05:00
static void benchmark ( char * title , char * cmd , int len ) {
client c ;
2010-08-30 05:25:02 -04:00
config . title = title ;
2009-03-22 05:30:00 -04:00
config . donerequests = 0 ;
2010-12-23 05:04:44 -05:00
c = createClient ( cmd , len ) ;
2010-12-22 12:31:33 -05:00
createMissingClients ( c ) ;
config . start = mstime ( ) ;
aeMain ( config . el ) ;
2009-03-22 05:30:00 -04:00
config . totlatency = mstime ( ) - config . start ;
2010-12-22 12:31:33 -05:00
2010-08-30 05:25:02 -04:00
showLatencyReport ( ) ;
2009-03-22 05:30:00 -04:00
freeAllClients ( ) ;
}
void parseOptions ( int argc , char * * argv ) {
int i ;
for ( i = 1 ; i < argc ; i + + ) {
int lastarg = i = = argc - 1 ;
if ( ! strcmp ( argv [ i ] , " -c " ) & & ! lastarg ) {
config . numclients = atoi ( argv [ i + 1 ] ) ;
i + + ;
} else if ( ! strcmp ( argv [ i ] , " -n " ) & & ! lastarg ) {
config . requests = atoi ( argv [ i + 1 ] ) ;
i + + ;
} else if ( ! strcmp ( argv [ i ] , " -k " ) & & ! lastarg ) {
config . keepalive = atoi ( argv [ i + 1 ] ) ;
i + + ;
} else if ( ! strcmp ( argv [ i ] , " -h " ) & & ! lastarg ) {
2010-11-04 08:37:05 -04:00
config . hostip = argv [ i + 1 ] ;
2009-03-22 05:30:00 -04:00
i + + ;
} else if ( ! strcmp ( argv [ i ] , " -p " ) & & ! lastarg ) {
config . hostport = atoi ( argv [ i + 1 ] ) ;
i + + ;
2010-08-01 16:55:24 -04:00
} else if ( ! strcmp ( argv [ i ] , " -s " ) & & ! lastarg ) {
config . hostsocket = argv [ i + 1 ] ;
i + + ;
2009-03-22 05:30:00 -04:00
} else if ( ! strcmp ( argv [ i ] , " -d " ) & & ! lastarg ) {
config . datasize = atoi ( argv [ i + 1 ] ) ;
i + + ;
if ( config . datasize < 1 ) config . datasize = 1 ;
if ( config . datasize > 1024 * 1024 ) config . datasize = 1024 * 1024 ;
2009-05-10 18:36:12 -04:00
} else if ( ! strcmp ( argv [ i ] , " -r " ) & & ! lastarg ) {
2009-05-09 03:25:59 -04:00
config . randomkeys = 1 ;
2009-05-10 18:36:12 -04:00
config . randomkeys_keyspacelen = atoi ( argv [ i + 1 ] ) ;
if ( config . randomkeys_keyspacelen < 0 )
config . randomkeys_keyspacelen = 0 ;
i + + ;
2009-03-22 05:30:00 -04:00
} else if ( ! strcmp ( argv [ i ] , " -q " ) ) {
config . quiet = 1 ;
} else if ( ! strcmp ( argv [ i ] , " -l " ) ) {
config . loop = 1 ;
2009-11-19 07:08:54 -05:00
} else if ( ! strcmp ( argv [ i ] , " -D " ) ) {
config . debug = 1 ;
2009-11-23 12:50:39 -05:00
} else if ( ! strcmp ( argv [ i ] , " -I " ) ) {
config . idlemode = 1 ;
2009-03-22 05:30:00 -04:00
} else {
printf ( " Wrong option '%s' or option argument missing \n \n " , argv [ i ] ) ;
printf ( " Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>] \n \n " ) ;
printf ( " -h <hostname> Server hostname (default 127.0.0.1) \n " ) ;
2010-08-01 16:55:24 -04:00
printf ( " -p <port> Server port (default 6379) \n " ) ;
printf ( " -s <socket> Server socket (overrides host and port) \n " ) ;
2009-03-22 05:30:00 -04:00
printf ( " -c <clients> Number of parallel connections (default 50) \n " ) ;
printf ( " -n <requests> Total number of requests (default 10000) \n " ) ;
printf ( " -d <size> Data size of SET/GET value in bytes (default 2) \n " ) ;
printf ( " -k <boolean> 1=keep alive 0=reconnect (default 1) \n " ) ;
2010-03-04 17:05:12 -05:00
printf ( " -r <keyspacelen> Use random keys for SET/GET/INCR, random values for SADD \n " ) ;
2009-05-10 18:36:12 -04:00
printf ( " Using this option the benchmark will get/set keys \n " ) ;
printf ( " in the form mykey_rand000000012456 instead of constant \n " ) ;
printf ( " keys, the <keyspacelen> argument determines the max \n " ) ;
printf ( " number of values for the random number. For instance \n " ) ;
printf ( " if set to 10 only rand000000000000 - rand000000000009 \n " ) ;
printf ( " range will be allowed. \n " ) ;
2009-03-22 05:30:00 -04:00
printf ( " -q Quiet. Just show query/sec values \n " ) ;
printf ( " -l Loop. Run the tests forever \n " ) ;
2009-11-23 12:50:39 -05:00
printf ( " -I Idle mode. Just open N idle connections and wait. \n " ) ;
2009-11-19 07:08:54 -05:00
printf ( " -D Debug mode. more verbose. \n " ) ;
2009-03-22 05:30:00 -04:00
exit ( 1 ) ;
}
}
}
2010-08-30 05:25:02 -04:00
int showThroughput ( struct aeEventLoop * eventLoop , long long id , void * clientData ) {
REDIS_NOTUSED ( eventLoop ) ;
REDIS_NOTUSED ( id ) ;
REDIS_NOTUSED ( clientData ) ;
float dt = ( float ) ( mstime ( ) - config . start ) / 1000.0 ;
float rps = ( float ) config . donerequests / dt ;
printf ( " %s: %.2f \r " , config . title , rps ) ;
fflush ( stdout ) ;
return 250 ; /* every 250ms */
}
2009-03-22 05:30:00 -04:00
int main ( int argc , char * * argv ) {
2010-12-16 17:41:58 -05:00
int i ;
2009-03-22 05:30:00 -04:00
client c ;
signal ( SIGHUP , SIG_IGN ) ;
signal ( SIGPIPE , SIG_IGN ) ;
2009-11-19 07:08:54 -05:00
config . debug = 0 ;
2009-03-22 05:30:00 -04:00
config . numclients = 50 ;
config . requests = 10000 ;
config . liveclients = 0 ;
config . el = aeCreateEventLoop ( ) ;
2010-08-30 05:25:02 -04:00
aeCreateTimeEvent ( config . el , 1 , showThroughput , NULL , NULL ) ;
2009-03-22 05:30:00 -04:00
config . keepalive = 1 ;
config . donerequests = 0 ;
config . datasize = 3 ;
2009-05-09 03:25:59 -04:00
config . randomkeys = 0 ;
2009-05-10 18:36:12 -04:00
config . randomkeys_keyspacelen = 0 ;
2009-03-22 05:30:00 -04:00
config . quiet = 0 ;
config . loop = 0 ;
2009-11-23 12:50:39 -05:00
config . idlemode = 0 ;
2009-03-22 05:30:00 -04:00
config . latency = NULL ;
config . clients = listCreate ( ) ;
config . hostip = " 127.0.0.1 " ;
config . hostport = 6379 ;
2010-08-01 16:55:24 -04:00
config . hostsocket = NULL ;
2009-03-22 05:30:00 -04:00
parseOptions ( argc , argv ) ;
2010-11-04 09:47:15 -04:00
config . latency = zmalloc ( sizeof ( long long ) * config . requests ) ;
2009-03-22 05:30:00 -04:00
if ( config . keepalive = = 0 ) {
2009-10-03 04:54:27 -04:00
printf ( " WARNING: keepalive disabled, you probably need 'echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse' for Linux and 'sudo sysctl -w net.inet.tcp.msl=1000' for Mac OS X in order to use a lot of clients/requests \n " ) ;
2009-03-22 05:30:00 -04:00
}
2009-11-23 12:50:39 -05:00
if ( config . idlemode ) {
printf ( " Creating %d idle connections and waiting forever (Ctrl+C when done) \n " , config . numclients ) ;
2010-12-23 05:04:44 -05:00
c = createClient ( " " , 0 ) ; /* will never receive a reply */
2009-11-23 12:50:39 -05:00
createMissingClients ( c ) ;
aeMain ( config . el ) ;
/* and will wait for every */
}
2009-03-22 05:30:00 -04:00
do {
2010-12-16 18:19:32 -05:00
char * data , * cmd ;
int len ;
data = zmalloc ( config . datasize + 1 ) ;
2010-12-16 17:41:58 -05:00
memset ( data , ' x ' , config . datasize ) ;
data [ config . datasize ] = ' \0 ' ;
2010-12-22 12:31:33 -05:00
benchmark ( " PING (inline) " , " PING \r \n " , 6 ) ;
2010-02-06 07:39:07 -05:00
2010-12-16 18:19:32 -05:00
len = redisFormatCommand ( & cmd , " PING " ) ;
2010-12-22 12:31:33 -05:00
benchmark ( " PING " , cmd , len ) ;
free ( cmd ) ;
2010-12-22 12:39:52 -05:00
const char * argv [ 21 ] ;
2010-12-22 12:31:33 -05:00
argv [ 0 ] = " MSET " ;
2010-12-22 12:39:52 -05:00
for ( i = 1 ; i < 21 ; i + = 2 ) {
argv [ i ] = " foo:rand:000000000000 " ;
argv [ i + 1 ] = data ;
}
len = redisFormatCommandArgv ( & cmd , 21 , argv , NULL ) ;
2010-12-22 12:31:33 -05:00
benchmark ( " MSET (10 keys) " , cmd , len ) ;
2010-12-16 18:19:32 -05:00
free ( cmd ) ;
2010-10-15 12:17:06 -04:00
2010-12-16 18:19:32 -05:00
len = redisFormatCommand ( & cmd , " SET foo:rand:000000000000 %s " , data ) ;
2010-12-22 12:31:33 -05:00
benchmark ( " SET " , cmd , len ) ;
2010-12-16 18:19:32 -05:00
free ( cmd ) ;
2009-03-22 05:30:00 -04:00
2010-12-16 18:19:32 -05:00
len = redisFormatCommand ( & cmd , " GET foo:rand:000000000000 " ) ;
2010-12-22 12:31:33 -05:00
benchmark ( " GET " , cmd , len ) ;
2010-12-16 18:19:32 -05:00
free ( cmd ) ;
2009-03-22 05:30:00 -04:00
2010-12-16 18:19:32 -05:00
len = redisFormatCommand ( & cmd , " INCR counter:rand:000000000000 " ) ;
2010-12-22 12:31:33 -05:00
benchmark ( " INCR " , cmd , len ) ;
2010-12-16 18:19:32 -05:00
free ( cmd ) ;
2009-03-22 05:30:00 -04:00
2010-12-16 18:19:32 -05:00
len = redisFormatCommand ( & cmd , " LPUSH mylist %s " , data ) ;
2010-12-22 12:31:33 -05:00
benchmark ( " LPUSH " , cmd , len ) ;
2010-12-16 18:19:32 -05:00
free ( cmd ) ;
2009-03-22 05:30:00 -04:00
2010-12-16 18:19:32 -05:00
len = redisFormatCommand ( & cmd , " LPOP mylist " ) ;
2010-12-22 12:31:33 -05:00
benchmark ( " LPOP " , cmd , len ) ;
2010-12-16 18:19:32 -05:00
free ( cmd ) ;
2009-03-22 05:30:00 -04:00
2010-12-16 18:19:32 -05:00
len = redisFormatCommand ( & cmd , " SADD myset counter:rand:000000000000 " ) ;
2010-12-22 12:31:33 -05:00
benchmark ( " SADD " , cmd , len ) ;
2010-12-16 18:19:32 -05:00
free ( cmd ) ;
2010-03-04 17:05:12 -05:00
2010-12-16 18:19:32 -05:00
len = redisFormatCommand ( & cmd , " SPOP myset " ) ;
2010-12-22 12:31:33 -05:00
benchmark ( " SPOP " , cmd , len ) ;
2010-12-16 18:19:32 -05:00
free ( cmd ) ;
2010-03-04 17:05:12 -05:00
2010-12-16 18:19:32 -05:00
len = redisFormatCommand ( & cmd , " LPUSH mylist %s " , data ) ;
2010-12-22 12:31:33 -05:00
benchmark ( " LPUSH (again, in order to bench LRANGE) " , cmd , len ) ;
2010-12-16 18:19:32 -05:00
free ( cmd ) ;
2009-11-17 10:57:35 -05:00
2010-12-16 18:19:32 -05:00
len = redisFormatCommand ( & cmd , " LRANGE mylist 0 99 " ) ;
2010-12-22 12:31:33 -05:00
benchmark ( " LRANGE (first 100 elements) " , cmd , len ) ;
2010-12-16 18:19:32 -05:00
free ( cmd ) ;
2009-11-17 10:57:35 -05:00
2010-12-16 18:19:32 -05:00
len = redisFormatCommand ( & cmd , " LRANGE mylist 0 299 " ) ;
2010-12-22 12:31:33 -05:00
benchmark ( " LRANGE (first 300 elements) " , cmd , len ) ;
2010-12-16 18:19:32 -05:00
free ( cmd ) ;
2009-11-18 13:02:20 -05:00
2010-12-16 18:19:32 -05:00
len = redisFormatCommand ( & cmd , " LRANGE mylist 0 449 " ) ;
2010-12-22 12:31:33 -05:00
benchmark ( " LRANGE (first 450 elements) " , cmd , len ) ;
2010-12-16 18:19:32 -05:00
free ( cmd ) ;
2009-11-18 13:41:25 -05:00
2010-12-16 18:19:32 -05:00
len = redisFormatCommand ( & cmd , " LRANGE mylist 0 599 " ) ;
2010-12-22 12:31:33 -05:00
benchmark ( " LRANGE (first 600 elements) " , cmd , len ) ;
2010-12-16 18:19:32 -05:00
free ( cmd ) ;
2009-11-18 13:41:25 -05:00
2009-03-22 05:30:00 -04:00
printf ( " \n " ) ;
} while ( config . loop ) ;
return 0 ;
}