vlen;
? ? argv = NULL;
}
redisCommandArgv接口传递的Vector方案
?
还是使用redisCommandArgv接口,使用vector来构造这个const char **,这个方法是从参考资料1中学到的:
?
void mset2( redisContext *c, const vector &vtKey, const vector & vtVal)
{
? ? if(vtKey.size() != vtVal.size())
? ? {
? ? ? ? throw runtime_error( "Redis error" );
? ? }
?
? ? vector argv( vtKey.size() + vtVal.size() + 1 );
? ? vector argvlen( vtKey.size() + ?vtVal.size() + 1 );
? ? int j = 0;
?
? ? static char msetcmd[] = "MSET";
? ? argv[j] = msetcmd;
? ? argvlen[j] = sizeof(msetcmd)-1;
? ? ++j;
?
? ? for(int i = 0;i< vtKey.size();++i)
? ? {
? ? ? ? argvlen[j] = vtKey[i].length();
? ? ? ? argv[j] = new char[argvlen[j]];
? ? ? ? ?memset((void*)argv[j],0,argvlen[j] );
? ? ? ? memcpy((void*)argv[j],vtKey[i].data(),vtKey[i].length());
? ? ? ? j++;
?
? ? ? ? argvlen[j] = vtVal[i].length();
? ? ? ? argv[j] = new char[argvlen[j]];
? ? ? ? memset((void*)argv[j],0,argvlen[j]);
? ? ? ? memcpy((void*)argv[j],vtVal[i].data(),vtVal[i].length());
? ? ? ? j++;
? ? }
?
? ? void *r = redisCommandArgv(c, argv.size(), &(argv[0]), &(argvlen[0]) );
? ? if ( !r )
? ? ? ? throw runtime_error( "Redis error" );
? ? freeReplyObject( r );
}
这样,就实现二进制数据的传递;
?
二进制校验
?
程序执行后,可以用redis-cli来验证:
?
对于非二进制安全的实现,二进制内容是截断的:
/opt/app/colin$./redis-cli get D
"AB"
而二进制安全的实现接口,二进制数据的0通过转义方式显示:
/opt/app/colin$./redis-cli get D
"AB\x00DE"