mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 09:00:51 +00:00
use qsort and bsearch to lookup commands in O(log(N)) instead of O(N)
This commit is contained in:
parent
3caf15e6da
commit
1a132bbc9c
37
redis.c
37
redis.c
@ -752,7 +752,9 @@ static void unwatchCommand(redisClient *c);
|
||||
|
||||
/* Global vars */
|
||||
static struct redisServer server; /* server global state */
|
||||
static struct redisCommand cmdTable[] = {
|
||||
static struct redisCommand *commandTable;
|
||||
static unsigned int commandTableSize;
|
||||
static struct redisCommand readonlyCommandTable[] = {
|
||||
{"get",getCommand,2,REDIS_CMD_INLINE,NULL,1,1,1},
|
||||
{"set",setCommand,3,REDIS_CMD_BULK|REDIS_CMD_DENYOOM,NULL,0,0,0},
|
||||
{"setnx",setnxCommand,3,REDIS_CMD_BULK|REDIS_CMD_DENYOOM,NULL,0,0,0},
|
||||
@ -2247,13 +2249,33 @@ static void sendReplyToClientWritev(aeEventLoop *el, int fd, void *privdata, int
|
||||
}
|
||||
}
|
||||
|
||||
static struct redisCommand *lookupCommand(char *name) {
|
||||
int j = 0;
|
||||
while(cmdTable[j].name != NULL) {
|
||||
if (!strcasecmp(name,cmdTable[j].name)) return &cmdTable[j];
|
||||
j++;
|
||||
static int qsortRedisCommands(const void *r1, const void *r2) {
|
||||
return strcasecmp(
|
||||
((struct redisCommand*)r1)->name,
|
||||
((struct redisCommand*)r2)->name);
|
||||
}
|
||||
return NULL;
|
||||
|
||||
static void sortCommandTable() {
|
||||
int i = 0, size = 0;
|
||||
|
||||
/* Determine and store the size of the command table */
|
||||
while(readonlyCommandTable[i++].name != NULL) size++;
|
||||
commandTableSize = size;
|
||||
|
||||
/* Copy and sort the read-only version of the command table */
|
||||
commandTable = (struct redisCommand*)malloc(sizeof(readonlyCommandTable));
|
||||
memcpy(commandTable,readonlyCommandTable,sizeof(readonlyCommandTable));
|
||||
qsort(commandTable,size,sizeof(struct redisCommand),qsortRedisCommands);
|
||||
}
|
||||
|
||||
static struct redisCommand *lookupCommand(char *name) {
|
||||
struct redisCommand tmp = {name,NULL,0,0,NULL,0,0,0};
|
||||
return bsearch(
|
||||
&tmp,
|
||||
commandTable,
|
||||
commandTableSize,
|
||||
sizeof(struct redisCommand),
|
||||
qsortRedisCommands);
|
||||
}
|
||||
|
||||
/* resetClient prepare the client to process the next command */
|
||||
@ -10935,6 +10957,7 @@ int main(int argc, char **argv) {
|
||||
time_t start;
|
||||
|
||||
initServerConfig();
|
||||
sortCommandTable();
|
||||
if (argc == 2) {
|
||||
if (strcmp(argv[1], "-v") == 0 ||
|
||||
strcmp(argv[1], "--version") == 0) version();
|
||||
|
Loading…
x
Reference in New Issue
Block a user