欢迎投稿

今日深度:

Redis 命令处理流程

Redis 命令处理流程



关键数据结构和方法

1) struct redisCommand 

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;
};
对比某一个记录看一下字段的含义,也学习一下如何设计一个好的命令协议。 {"set",setCommand,-3,"wm",0,noPreloadGetKeys,1,1,1,0,0},
 * 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.
redisGetKeysProc以及后续的参数是处理参数列表,从命令行中解析出那些是key那些是value。

假设我们希望返回服务端的易读懂的时间,并且根据传入的参数返回时间的格式。
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);		

}



www.htsjk.Com true http://www.htsjk.com/shujukunews/355.html NewsArticle Redis 命令处理流程 关键数据结构和方法 1) struct redisCommand struct redisCommand { char *name; redisCommandProc *proc; int arity; char *sflags; /* Flags as string representation, one char per flag. */ int flags; /* The actu...
评论暂时关闭