栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

redis1.2.6 redis-cli.c发送命令

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

redis1.2.6 redis-cli.c发送命令

main函数基本流程:

大致代码如下:

int main(int argc, char **argv) {
    int firstarg;
    char **argvcopy;
    struct redisCommand *rc;
    //设置基本配置
    config.hostip = "127.0.0.1";
    config.hostport = 6379;
    ....
	//......基本配置代码
	
	//格式化命令
    firstarg = parseOptions(argc,argv);//格式化命令行参数,返回参数为执行参数的个数


    if (config.auth != NULL) {//有权限
        ...
        有权限的操作
    }
    //启动时没有参数或 进入交互模式    例如./redis-cli
    if (argc == 0 || config.interactive == 1) repl();

    
    //将后面的未执行的命令拷贝到argvcopy
    //例如./redis-cli set name wwz 
    argvcopy = convertToSds(argc, argv);
	//结果为argvcopy[0] = set argvcopy[1] = name argvcopy[2] = wwz 
	
  
    if ((rc = lookupCommand(argv[0])) != NULL) {//命令是否存在
      if (rc->arity > 0 && argc == rc->arity-1) {//这个时arity是正数且合法长度的
        sds lastarg = readArgFromStdin();
        argvcopy[argc] = lastarg;//再来一个结束符
        argc++;
      }
    }
	//进行下一条语句完成后,结束客户端程序。
    return cliSendCommand(argc, argvcopy, config.repeat);
}

客户端发送命令函数cliSendCommand

static int cliSendCommand(int argc, char **argv, int repeat) {
    
    //检查命令是否合法,连接客户端与服务器
    .....

    //选择数据库
    retval = selectDb(fd);
	...
	
    while(repeat--) {//一般都是1 意思为循环一次 执行一次命令
        //以发送命令多元为例
        cmd = sdsempty();
        if (rc->flags & REDIS_CMD_MULTIBULK) {
            //命令;mset name wwz age 21
            cmd = sdscatprintf(cmd,"*%drn",argc);//*5rn
            for (j = 0; j < argc; j++) {
                cmd = sdscatprintf(cmd,"$%lurn",
                    (unsigned long)sdslen(argv[j]));
                cmd = sdscatlen(cmd,argv[j],sdslen(argv[j]));
                cmd = sdscatlen(cmd,"rn",2);
            }
            //*5rn$4msetrn$4namern$3wwzrn$3age$221rn
        } 
        ....
        
        
        //发送--------
        anetWrite(fd,cmd,sdslen(cmd));
        sdsfree(cmd);

		
//读取,判断类型再进行进一步读取,注意cliReadMultiBulkReply[多元的]的每一个元素都调用了cliReadBulkReply(就是类型为$的)
        retval = cliReadReply(fd);
        if (retval) {
            return retval;
        }
    }
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/784540.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号