亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++訪問Redis的mset 二進制數據接口封裝方案

2020-01-26 15:03:50
字體:
來源:轉載
供稿:網友

需求

C++中使用hiredis客戶端接口訪問redis;
需要使用mset一次設置多個二進制數據

以下給出三種封裝實現方案;

簡單拼接方案

在redis-cli中,mset的語法是這樣的:

復制代碼 代碼如下:

/opt/colin$./redis-cli mset a 11 b 22 c 333

OK

按照這樣的語法拼接后,直接使用hiredis字符串接口redisCommand傳遞:

void msetNotBinary(redisContext *c, const vector<string> &vtKey, const vector<string> & vtVal ){  if(vtKey.size() != vtVal.size())  {    throw runtime_error( "Redis error" );  }  string strCmd = "MSET";  for(int i = 0; i < vtKey.size(); i++)  {    strCmd += " "+vtKey[i]+" "+vtVal[i];  }  cout << "strCmd:" << strCmd << endl;  void * r = redisCommand(c, strCmd.c_str() );  if ( !r )    throw runtime_error( "Redis error" );  freeReplyObject( r );}void do_test( redisContext *c ){    vector<string> vtKey;  vector<string> vtVal;  vtKey.push_back("A");  vtVal.push_back("AAAA");  vtKey.push_back("B");  vtVal.push_back("BBBB");  vtKey.push_back("C");  vtVal.push_back("CCCC");  //add a binary data  vtKey.push_back("D");  vtVal.push_back("");  char a[] = "ABCDE";  a[2] = 0;  vtVal[3].assign(a,5);  try  {    msetNotBinary(c, vtKey, vtVal );    //mset1( c, vtKey, vtVal );    //mset2( c, vtKey, vtVal );  }  catch ( runtime_error & )  {    cout << "Error" << endl;  }}int main(int argc, char *argv[]){  redisContext *c;  c = redisConnect("127.0.0.1",6379);  if (c->err)   {    cout << "Connection error: " << c->errstr << endl;    return -1;  }  do_test(c);  redisFree(c);  return 0;}

這種方式可以處理mset多個字符串數據,但對于數據內容為二進制數據的無能為力;

redisCommandArgv接口傳遞 方案

對于多個參數傳遞,hiredis提供了以下接口,這個接口中最后一個參數是所有的傳入數據的內容長度,
就是說這個接口是二進制安全的:

void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
主要工作就是構造一個動態的二維數組char ** argv,其中涉及到char **到const char **的轉換,有一定的風險,
關于這一點前一篇文章已經談到;

void mset1( redisContext *c, const vector<string> &vtKey, const vector<string> & vtVal ){  if(vtKey.size() != vtVal.size())  {    throw runtime_error( "Redis error" );  }  char ** argv = new char*[vtKey.size() + vtVal.size() + 1 ];  size_t * argvlen = new size_t[vtKey.size() + vtVal.size() + 1 ];  int j = 0;  argv[j] = new char[5];  memcpy(argv[j],"MSET",4);  argvlen[j] = 4;  ++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++;  }  //if not use const_cast<const char**> ,compile error  //for why assign from char** to const char** error, see my blog ...   void *r = redisCommandArgv(c, vtKey.size() + vtVal.size() + 1, const_cast<const char**>(argv), argvlen );  if ( !r )    throw runtime_error( "Redis error" );  freeReplyObject( r );  for(int i = 0;i < vtKey.size();i++)  {    delete [] argv[i];    argv[i] = NULL;  }  delete []argv;  delete []argvlen;  argv = NULL;}

redisCommandArgv接口傳遞的Vector方案

還是使用redisCommandArgv接口,使用vector來構造這個const char **,這個方法是從參考資料1中學到的:

void mset2( redisContext *c, const vector<string> &vtKey, const vector<string> & vtVal){  if(vtKey.size() != vtVal.size())  {    throw runtime_error( "Redis error" );  }  vector<const char *> argv( vtKey.size() + vtVal.size() + 1 );  vector<size_t> 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"

完整可執行的代碼詳見github:https://github.com/me115/cppset/tree/master/2DimArray

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
丝袜亚洲另类欧美重口| 欧美日韩亚洲天堂| 亚洲欧洲日本专区| 久久99久久99精品中文字幕| xvideos亚洲人网站| 国模精品一区二区三区色天香| 欧美精品亚州精品| 国产91精品久| 欧美激情国产高清| 国产亚洲在线播放| 日韩国产在线播放| 亚洲一区二区黄| 日本欧美一级片| 国产精品一久久香蕉国产线看观看| 乱亲女秽乱长久久久| 国产精品白嫩美女在线观看| 国产成+人+综合+亚洲欧洲| 亚洲天堂色网站| 欧美黑人极品猛少妇色xxxxx| 国产在线视频欧美| 亚洲精品乱码久久久久久金桔影视| 亚洲精品98久久久久久中文字幕| 91社区国产高清| 91精品视频免费看| 国产精品久久久久久久久久东京| 欧美国产视频日韩| 77777少妇光屁股久久一区| 欧美亚洲第一区| 精品日韩视频在线观看| 国产精品99久久久久久久久| 欧美在线性爱视频| 亚洲九九九在线观看| 亚洲qvod图片区电影| 中文字幕亚洲欧美日韩2019| 久久久久久久久久国产| 两个人的视频www国产精品| 色偷偷av一区二区三区乱| 国产精品成人一区二区三区吃奶| 久久视频免费观看| 亚洲伊人第一页| 日韩中文字幕欧美| 69av视频在线播放| 高清欧美性猛交| www.xxxx欧美| 日韩视频在线免费观看| **欧美日韩vr在线| 久久av.com| 在线播放亚洲激情| 国产有码在线一区二区视频| 亚洲黄页视频免费观看| 欧美洲成人男女午夜视频| 日韩在线观看网站| 91久久精品国产91性色| 国精产品一区一区三区有限在线| 国产美女精品视频| 国产精品1区2区在线观看| 亚洲精品福利在线观看| 国产精品免费视频久久久| 美女扒开尿口让男人操亚洲视频网站| 欧美午夜xxx| 午夜剧场成人观在线视频免费观看| 亚洲国产古装精品网站| 久久久www成人免费精品| 日韩av电影在线免费播放| 亚洲视频欧美视频| 国产精品中文久久久久久久| 丁香五六月婷婷久久激情| 91久久久久久国产精品| 国产伦精品免费视频| 午夜精品久久久久久久男人的天堂| 日韩成人在线观看| 中文字幕精品在线| 国产精品美女www爽爽爽视频| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲精品第一国产综合精品| 91久久久亚洲精品| 国产日韩欧美在线播放| 久久精品国产一区二区三区| 亚洲精品国产精品国自产观看浪潮| 久久成人一区二区| 亚洲欧美成人精品| 91免费电影网站| 日韩视频一区在线| 97成人超碰免| 欧美重口另类videos人妖| 久久久久久97| 色小说视频一区| www.日本久久久久com.| 疯狂做受xxxx欧美肥白少妇| 日韩免费在线视频| 亚洲人成电影在线观看天堂色| 日本免费一区二区三区视频观看| 午夜精品美女自拍福到在线| 欧美专区中文字幕| 国产精品免费视频xxxx| 欧美伦理91i| 伊人成人开心激情综合网| 26uuu亚洲国产精品| 91精品国产高清久久久久久久久| 亚洲xxxx在线| 色综合久久久久久中文网| 91精品国产91| 久久精品99久久久久久久久| 91视频免费网站| 欧美日韩精品在线视频| 久久亚洲电影天堂| 国产精品看片资源| 国产精品视频大全| 成人午夜两性视频| 狠狠综合久久av一区二区小说| 欧美亚洲国产成人精品| 成人免费午夜电影| 日本精品久久中文字幕佐佐木| 国产亚洲精品美女| 欧美精品性视频| 日韩精品999| 一区二区三区回区在观看免费视频| 国产日韩欧美中文在线播放| 亚洲视频在线观看| 午夜精品三级视频福利| 欧美日韩亚洲一区二| 亚洲激情视频在线播放| 国内成人精品一区| 国产一区二区三区中文| 日韩欧美有码在线| 日韩欧美国产中文字幕| 欧美精品在线观看91| 欧美性猛xxx| 在线午夜精品自拍| 久久精品99久久久久久久久| 欧美最顶级丰满的aⅴ艳星| 亚洲欧美一区二区三区情侣bbw| 国内精品久久久久影院优| 一本色道久久88亚洲综合88| 亚洲激情视频网| 成人a免费视频| 日韩精品免费视频| 中文字幕精品在线视频| 日本精品va在线观看| 国产精品久久久久久久久免费| 97色伦亚洲国产| 久久五月天综合| 疯狂做受xxxx欧美肥白少妇| 欧美精品久久一区二区| 2019中文在线观看| 668精品在线视频| 91在线高清免费观看| 国产噜噜噜噜噜久久久久久久久| 亚洲日韩欧美视频一区| 亚洲自拍高清视频网站| 久久久在线观看| 国产aaa精品| 成人午夜在线观看| 欧美激情一二区| 欧美精品性视频| 国产欧美精品在线| 国产欧美日韩高清| 97久久久免费福利网址| 欧美丝袜一区二区三区| 国产午夜精品一区二区三区| 日本亚洲精品在线观看| 欧美一级在线亚洲天堂| 欧美最顶级丰满的aⅴ艳星| 国产精品丝袜久久久久久不卡|