关键数据结构和方法 1) struct redisCommand redisCommandTable 位于redis.c:115 2) processCommand 位于redis.c:1653 redisCommand数据结构 struct redisCommand { char *name; redisCommandProc *proc; int arity; char *sflags; /* Flags as string rep
struct redisCommand { char *name; redisCommandProc *proc; int arity; char *sflags; /* Flags as string representation, one char per flag. */ int flags; /* The actual flags, obtained from the 'sflags' field. */ /* Use a function to determine keys arguments in a command line. */ redisGetKeysProc *getkeys_proc; /* What keys should be loaded in background when calling this command? */ int firstkey; /* The first argument that's a key (0 = no keys) */ int lastkey; /* The last argument that's a key */ int keystep; /* The step between first and last key */ long long microseconds, calls; };
* w: write command (may modify the key space). * r: read command (will never modify the key space). * m: may increase memory usage once called. Don't allow if out of memory. * a: admin command, like SAVE or SHUTDOWN. * p: Pub/Sub related command. * f: force replication of this command, regardless of server.dirty. * s: command not allowed in scripts. * R: random command. Command is not deterministic, that is, the same command * with the same arguments, with the same key space, may have different * results. For instance SPOP and RANDOMKEY are two random commands. * S: Sort command output array if called from script, so that the output * is deterministic. * l: Allow command while loading the database. * t: Allow command while a slave has stale data but is not allowed to * server this data. Normally no command is accepted in this condition * but just a few. * M: Do not automatically propagate the command on MONITOR.
void utimeCommand(redisClient *c) { char * fmt = c->argv[1]->ptr; char fmtResult[64]; memset(fmtResult,0,64); struct timeval tv; gettimeofday(&tv,NULL); struct tm *tm; tm = localtime(&tv.tv_sec); if(tm!=NULL){ strftime(fmtResult, sizeof fmtResult, fmt, tm); }else{ sprintf(fmtResult,"%s","error when retriving time"); } addReplyBulkCString(c,fmtResult); }