Redis 命令处理流程
关键数据结构和方法
1) struct redisCommandstruct 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);
}
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。