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

首頁 > 數據庫 > Redis > 正文

Redis教程(十五):C語言連接操作代碼實例

2020-10-28 21:41:02
字體:
來源:轉載
供稿:網友

在之前的博客中已經非常詳細的介紹了Redis的各種操作命令、運行機制和服務器初始化參數配置。本篇博客是該系列博客中的最后一篇,在這里將給出基于Redis客戶端組件訪問并操作Redis服務器的代碼示例。然而需要說明的是,由于Redis官方并未提供基于C接口的Windows平臺客戶端,因此下面的示例僅可運行于Linux/Unix平臺。但是對于使用其它編程語言的開發者而言,如C#和Java,Redis則提供了針對這些語言的客戶端組件,通過該方式,同樣可以達到基于Windows平臺與Redis服務器進行各種交互的目的。

該篇博客中使用的客戶端來自于Redis官方網站,是Redis推薦的基于C接口的客戶端組件,見如下鏈接:
https://github.com/antirez/hiredis
在下面的代碼示例中,將給出兩種最為常用的Redis命令操作方式,既普通調用方式和基于管線的調用方式。

注:在閱讀代碼時請留意注釋。

#include <stdio.h>#include <stdlib.h>#include <stddef.h>#include <stdarg.h>#include <string.h>#include <assert.h>#include <hiredis.h>void doTest(){  int timeout = 10000;  struct timeval tv;  tv.tv_sec = timeout / 1000;  tv.tv_usec = timeout * 1000;  //以帶有超時的方式鏈接Redis服務器,同時獲取與Redis連接的上下文對象。  //該對象將用于其后所有與Redis操作的函數。  redisContext* c = redisConnectWithTimeout("192.168.149.137",6379,tv);  if (c->err) {    redisFree(c);    return;  }  const char* command1 = "set stest1 value1";  redisReply* r = (redisReply*)redisCommand(c,command1);  //需要注意的是,如果返回的對象是NULL,則表示客戶端和服務器之間出現嚴重錯誤,必須重新鏈接。  //這里只是舉例說明,簡便起見,后面的命令就不再做這樣的判斷了。  if (NULL == r) {    redisFree(c);    return;  }  //不同的Redis命令返回的數據類型不同,在獲取之前需要先判斷它的實際類型。  //至于各種命令的返回值信息,可以參考Redis的官方文檔,或者查看該系列博客的前幾篇  //有關Redis各種數據類型的博客。:)  //字符串類型的set命令的返回值的類型是REDIS_REPLY_STATUS,然后只有當返回信息是"OK"  //時,才表示該命令執行成功。后面的例子以此類推,就不再過多贅述了。  if (!(r->type == REDIS_REPLY_STATUS && strcasecmp(r->str,"OK") == 0)) {    printf("Failed to execute command[%s]./n",command1);    freeReplyObject(r);    redisFree(c);    return;  }  //由于后面重復使用該變量,所以需要提前釋放,否則內存泄漏。  freeReplyObject(r);  printf("Succeed to execute command[%s]./n",command1);  const char* command2 = "strlen stest1";  r = (redisReply*)redisCommand(c,command2);  if (r->type != REDIS_REPLY_INTEGER) {    printf("Failed to execute command[%s]./n",command2);    freeReplyObject(r);    redisFree(c);    return;  }  int length = r->integer;  freeReplyObject(r);  printf("The length of 'stest1' is %d./n",length);  printf("Succeed to execute command[%s]./n",command2);  const char* command3 = "get stest1";  r = (redisReply*)redisCommand(c,command3);  if (r->type != REDIS_REPLY_STRING) {    printf("Failed to execute command[%s]./n",command3);    freeReplyObject(r);    redisFree(c);    return;  }  printf("The value of 'stest1' is %s./n",r->str);  freeReplyObject(r);  printf("Succeed to execute command[%s]./n",command3);  const char* command4 = "get stest2";  r = (redisReply*)redisCommand(c,command4);  //這里需要先說明一下,由于stest2鍵并不存在,因此Redis會返回空結果,這里只是為了演示。  if (r->type != REDIS_REPLY_NIL) {    printf("Failed to execute command[%s]./n",command4);    freeReplyObject(r);    redisFree(c);    return;  }  freeReplyObject(r);  printf("Succeed to execute command[%s]./n",command4);  const char* command5 = "mget stest1 stest2";  r = (redisReply*)redisCommand(c,command5);  //不論stest2存在與否,Redis都會給出結果,只是第二個值為nil。  //由于有多個值返回,因為返回應答的類型是數組類型。  if (r->type != REDIS_REPLY_ARRAY) {    printf("Failed to execute command[%s]./n",command5);    freeReplyObject(r);    redisFree(c);    //r->elements表示子元素的數量,不管請求的key是否存在,該值都等于請求是鍵的數量。    assert(2 == r->elements);    return;  }  for (int i = 0; i < r->elements; ++i) {    redisReply* childReply = r->element[i];    //之前已經介紹過,get命令返回的數據類型是string。    //對于不存在key的返回值,其類型為REDIS_REPLY_NIL。    if (childReply->type == REDIS_REPLY_STRING)      printf("The value is %s./n",childReply->str);  }  //對于每一個子應答,無需使用者單獨釋放,只需釋放最外部的redisReply即可。  freeReplyObject(r);  printf("Succeed to execute command[%s]./n",command5);  printf("Begin to test pipeline./n");  //該命令只是將待發送的命令寫入到上下文對象的輸出緩沖區中,直到調用后面的  //redisGetReply命令才會批量將緩沖區中的命令寫出到Redis服務器。這樣可以  //有效的減少客戶端與服務器之間的同步等候時間,以及網絡IO引起的延遲。  //至于管線的具體性能優勢,可以考慮該系列博客中的管線主題。  if (REDIS_OK != redisAppendCommand(c,command1)    || REDIS_OK != redisAppendCommand(c,command2)    || REDIS_OK != redisAppendCommand(c,command3)    || REDIS_OK != redisAppendCommand(c,command4)    || REDIS_OK != redisAppendCommand(c,command5)) {    redisFree(c);    return;  }  redisReply* reply = NULL;  //對pipeline返回結果的處理方式,和前面代碼的處理方式完全一直,這里就不再重復給出了。  if (REDIS_OK != redisGetReply(c,(void**)&reply)) {    printf("Failed to execute command[%s] with Pipeline./n",command1);    freeReplyObject(reply);    redisFree(c);  }  freeReplyObject(reply);  printf("Succeed to execute command[%s] with Pipeline./n",command1);  if (REDIS_OK != redisGetReply(c,(void**)&reply)) {    printf("Failed to execute command[%s] with Pipeline./n",command2);    freeReplyObject(reply);    redisFree(c);  }  freeReplyObject(reply);  printf("Succeed to execute command[%s] with Pipeline./n",command2);  if (REDIS_OK != redisGetReply(c,(void**)&reply)) {    printf("Failed to execute command[%s] with Pipeline./n",command3);    freeReplyObject(reply);    redisFree(c);  }  freeReplyObject(reply);  printf("Succeed to execute command[%s] with Pipeline./n",command3);  if (REDIS_OK != redisGetReply(c,(void**)&reply)) {    printf("Failed to execute command[%s] with Pipeline./n",command4);    freeReplyObject(reply);    redisFree(c);  }  freeReplyObject(reply);  printf("Succeed to execute command[%s] with Pipeline./n",command4);  if (REDIS_OK != redisGetReply(c,(void**)&reply)) {    printf("Failed to execute command[%s] with Pipeline./n",command5);    freeReplyObject(reply);    redisFree(c);  }  freeReplyObject(reply);  printf("Succeed to execute command[%s] with Pipeline./n",command5);  //由于所有通過pipeline提交的命令結果均已為返回,如果此時繼續調用redisGetReply,  //將會導致該函數阻塞并掛起當前線程,直到有新的通過管線提交的命令結果返回。  //最后不要忘記在退出前釋放當前連接的上下文對象。  redisFree(c);  return;}int main() {  doTest();  return 0;}//輸出結果如下://Succeed to execute command[set stest1 value1].//The length of 'stest1' is 6.//Succeed to execute command[strlen stest1].//The value of 'stest1' is value1.//Succeed to execute command[get stest1].//Succeed to execute command[get stest2].//The value is value1.//Succeed to execute command[mget stest1 stest2].//Begin to test pipeline.//Succeed to execute command[set stest1 value1] with Pipeline.//Succeed to execute command[strlen stest1] with Pipeline.//Succeed to execute command[get stest1] with Pipeline.//Succeed to execute command[get stest2] with Pipeline.//Succeed to execute command[mget stest1 stest2] with Pipeline.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品美女在线| 久久久久国产精品www| 538国产精品一区二区免费视频| 欧美激情乱人伦一区| 日韩视频在线免费| 国产日韩精品在线观看| 亚洲视频axxx| 国产精品扒开腿爽爽爽视频| 亚洲欧美激情在线视频| 日本中文字幕不卡免费| 欧美日韩精品在线| 国产精品黄页免费高清在线观看| 热久久99这里有精品| 欧美日韩成人免费| 久久精品99久久香蕉国产色戒| 这里精品视频免费| 中文国产成人精品久久一| 国语自产精品视频在免费| 亚洲色图综合网| 日产精品久久久一区二区福利| 色婷婷综合久久久久中文字幕1| 亚洲精品久久久久中文字幕欢迎你| 亚洲人成电影在线| 国产a∨精品一区二区三区不卡| 日韩免费观看视频| 亚洲毛片在线看| 国产亚洲精品久久久优势| 欧美亚洲成人精品| 欧美孕妇毛茸茸xxxx| 国产精品香蕉在线观看| 一个人看的www久久| 久久久久久18| 国产精品白嫩初高中害羞小美女| 中文字幕国内精品| 欧美日本亚洲视频| 欧美日韩在线另类| 欧美激情三级免费| 欧美另类99xxxxx| 久久在线免费观看视频| 91精品视频大全| 国产成人精品av在线| 亚洲sss综合天堂久久| 亚洲一级黄色片| 2019中文字幕在线观看| 国产日韩欧美在线观看| 国产69精品久久久久9| 亚洲iv一区二区三区| 欧美性一区二区三区| 日韩在线观看免费高清完整版| 欧美人成在线视频| 国产专区欧美专区| 日本道色综合久久影院| 欧洲亚洲免费视频| 欧美专区福利在线| 中文字幕日韩精品在线观看| 欧美电影电视剧在线观看| 在线视频国产日韩| 亚洲风情亚aⅴ在线发布| 国产伦精品一区二区三区精品视频| 日韩av在线一区| 国产精品91久久| 亚洲最大福利视频| 久久久亚洲网站| 成人激情电影一区二区| 久久成人人人人精品欧| 欧美在线观看一区二区三区| 久久精品国产91精品亚洲| 欧美视频在线观看免费| 国产91免费观看| 亚洲天堂网在线观看| 国产一区二区三区视频| 韩国三级电影久久久久久| 久久久精品国产网站| 欧美激情欧美狂野欧美精品| 91久久精品国产91性色| 亚洲激情视频在线观看| 久久久99久久精品女同性| 久久亚洲精品中文字幕冲田杏梨| 日韩av在线免费观看一区| 欧美剧在线观看| 欧美xxxx18性欧美| 91亚洲精品在线观看| 亚洲性生活视频在线观看| 日韩人在线观看| 国产精品美女久久久免费| 欧美专区第一页| 日韩国产精品视频| 成人福利在线观看| 久久久久久久久91| 日韩成人网免费视频| 亚洲а∨天堂久久精品喷水| 91福利视频网| 国产91在线视频| 亚洲偷熟乱区亚洲香蕉av| 日本精品免费观看| 国产精品亚洲自拍| 欧美色欧美亚洲高清在线视频| 亚洲欧洲日产国码av系列天堂| 日韩av网站导航| 亚洲最大的av网站| 精品亚洲一区二区三区在线播放| 久久久精品免费| 欧美交受高潮1| 精品视频在线播放色网色视频| 欧美成人在线免费视频| 国产精品一区二区在线| 亚洲男人天堂视频| 日韩国产精品视频| 红桃av永久久久| 国产亚洲精品激情久久| 久久国产精品影片| 亚洲日韩欧美视频一区| 国产精品88a∨| 国产精品久久久精品| 精品露脸国产偷人在视频| 亚洲精品一区久久久久久| 久久综合免费视频| 亚洲精品动漫久久久久| 欧美二区在线播放| 欧美一级电影久久| 色诱女教师一区二区三区| 亚洲天堂免费在线| 91九色蝌蚪国产| 久久久女女女女999久久| 国产精品日韩av| 日韩中文字在线| 久久久久久亚洲精品中文字幕| 成人做爽爽免费视频| 午夜精品久久久久久99热| 国产精品情侣自拍| 精品久久久久久久中文字幕| 51精品国产黑色丝袜高跟鞋| 国产精品福利久久久| 日韩一二三在线视频播| 精品偷拍一区二区三区在线看| 亚洲国产天堂网精品网站| 国产精品视频一区国模私拍| 国产精品久久精品| 久久久欧美精品| 91精品一区二区| 91精品在线看| 538国产精品一区二区免费视频| 亚洲第一免费播放区| 亚洲bt欧美bt日本bt| 国产精品69久久| 亚洲va电影大全| 亚洲精品网址在线观看| 色综合伊人色综合网| 成人福利在线观看| 亚洲精品一区二区网址| 中文字幕日韩欧美精品在线观看| 永久免费精品影视网站| 国产免费一区视频观看免费| 久久人91精品久久久久久不卡| 国产一区二中文字幕在线看| 成人免费网站在线观看| 国产亚洲视频在线| 中文字幕亚洲综合久久筱田步美| 久久久久久噜噜噜久久久精品| 欧美精品情趣视频| 欧美精品在线播放| 亚洲综合精品一区二区| 欧美亚洲在线观看| 97精品一区二区视频在线观看|