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

首頁 > 數據庫 > Redis > 正文

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

2020-03-17 12:42:36
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了Redis教程(十五):C語言連接操作代碼實例,本篇博客是該系列博客中的最后一篇,在這里將給出基于Redis客戶端組件訪問并操作Redis服務器的代碼示例,需要的朋友可以參考下

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

該篇博客中使用的客戶端來自于Redis官方網站,是Redis推薦的基于C接口的客戶端組件,見如下鏈接:

https://github.com/antirez/hiredis

在下面的代碼示例中,將給出兩種最為常用的Redis命令操作方式,既普通調用方式和基于管線的調用方式。

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

 

 
  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <stddef.h> 
  4. #include <stdarg.h> 
  5. #include <string.h> 
  6. #include <assert.h> 
  7. #include <hiredis.h> 
  8.  
  9. void doTest() 
  10. int timeout = 10000; 
  11. struct timeval tv; 
  12. tv.tv_sec = timeout / 1000; 
  13. tv.tv_usec = timeout * 1000; 
  14. //以帶有超時的方式鏈接Redis服務器,同時獲取與Redis連接的上下文對象。 
  15. //該對象將用于其后所有與Redis操作的函數。 
  16. redisContext* c = redisConnectWithTimeout("192.168.149.137",6379,tv); 
  17. if (c->err) { 
  18. redisFree(c); 
  19. return; 
  20. const char* command1 = "set stest1 value1"; 
  21. redisReply* r = (redisReply*)redisCommand(c,command1); 
  22. //需要注意的是,如果返回的對象是NULL,則表示客戶端和服務器之間出現嚴重錯誤,必須重新鏈接。 
  23. //這里只是舉例說明,簡便起見,后面的命令就不再做這樣的判斷了。 
  24. if (NULL == r) { 
  25. redisFree(c); 
  26. return; 
  27. //不同的Redis命令返回的數據類型不同,在獲取之前需要先判斷它的實際類型。 
  28. //至于各種命令的返回值信息,可以參考Redis的官方文檔,或者查看該系列博客的前幾篇 
  29. //有關Redis各種數據類型的博客。:) 
  30. //字符串類型的set命令的返回值的類型是REDIS_REPLY_STATUS,然后只有當返回信息是"OK" 
  31. //時,才表示該命令執行成功。后面的例子以此類推,就不再過多贅述了。 
  32. if (!(r->type == REDIS_REPLY_STATUS && strcasecmp(r->str,"OK") == 0)) { 
  33. printf("Failed to execute command[%s]./n",command1); 
  34. freeReplyObject(r); 
  35. redisFree(c); 
  36. return; 
  37. //由于后面重復使用該變量,所以需要提前釋放,否則內存泄漏。 
  38. freeReplyObject(r); 
  39. printf("Succeed to execute command[%s]./n",command1); 
  40.  
  41. const char* command2 = "strlen stest1"; 
  42. r = (redisReply*)redisCommand(c,command2); 
  43. if (r->type != REDIS_REPLY_INTEGER) { 
  44. printf("Failed to execute command[%s]./n",command2); 
  45. freeReplyObject(r); 
  46. redisFree(c); 
  47. return; 
  48. int length = r->integer; 
  49. freeReplyObject(r); 
  50. printf("The length of 'stest1' is %d./n",length); 
  51. printf("Succeed to execute command[%s]./n",command2); 
  52.  
  53. const char* command3 = "get stest1"; 
  54. r = (redisReply*)redisCommand(c,command3); 
  55. if (r->type != REDIS_REPLY_STRING) { 
  56. printf("Failed to execute command[%s]./n",command3); 
  57. freeReplyObject(r); 
  58. redisFree(c); 
  59. return; 
  60. printf("The value of 'stest1' is %s./n",r->str); 
  61. freeReplyObject(r); 
  62. printf("Succeed to execute command[%s]./n",command3); 
  63.  
  64. const char* command4 = "get stest2"; 
  65. r = (redisReply*)redisCommand(c,command4); 
  66. //這里需要先說明一下,由于stest2鍵并不存在,因此Redis會返回空結果,這里只是為了演示。 
  67. if (r->type != REDIS_REPLY_NIL) { 
  68. printf("Failed to execute command[%s]./n",command4); 
  69. freeReplyObject(r); 
  70. redisFree(c); 
  71. return; 
  72. freeReplyObject(r); 
  73. printf("Succeed to execute command[%s]./n",command4); 
  74.  
  75. const char* command5 = "mget stest1 stest2"; 
  76. r = (redisReply*)redisCommand(c,command5); 
  77. //不論stest2存在與否,Redis都會給出結果,只是第二個值為nil。 
  78. //由于有多個值返回,因為返回應答的類型是數組類型。 
  79. if (r->type != REDIS_REPLY_ARRAY) { 
  80. printf("Failed to execute command[%s]./n",command5); 
  81. freeReplyObject(r); 
  82. redisFree(c); 
  83. //r->elements表示子元素的數量,不管請求的key是否存在,該值都等于請求是鍵的數量。 
  84. assert(2 == r->elements); 
  85. return; 
  86. for (int i = 0; i < r->elements; ++i) { 
  87. redisReply* childReply = r->element[i]; 
  88. //之前已經介紹過,get命令返回的數據類型是string。 
  89. //對于不存在key的返回值,其類型為REDIS_REPLY_NIL。 
  90. if (childReply->type == REDIS_REPLY_STRING) 
  91. printf("The value is %s./n",childReply->str); 
  92. //對于每一個子應答,無需使用者單獨釋放,只需釋放最外部的redisReply即可。 
  93. freeReplyObject(r); 
  94. printf("Succeed to execute command[%s]./n",command5); 
  95.  
  96. printf("Begin to test pipeline./n"); 
  97. //該命令只是將待發送的命令寫入到上下文對象的輸出緩沖區中,直到調用后面的 
  98. //redisGetReply命令才會批量將緩沖區中的命令寫出到Redis服務器。這樣可以 
  99. //有效的減少客戶端與服務器之間的同步等候時間,以及網絡IO引起的延遲。 
  100. //至于管線的具體性能優勢,可以考慮該系列博客中的管線主題。 
  101. if (REDIS_OK != redisAppendCommand(c,command1) 
  102. || REDIS_OK != redisAppendCommand(c,command2) 
  103. || REDIS_OK != redisAppendCommand(c,command3) 
  104. || REDIS_OK != redisAppendCommand(c,command4) 
  105. || REDIS_OK != redisAppendCommand(c,command5)) { 
  106. redisFree(c); 
  107. return; 
  108.  
  109. redisReply* reply = NULL; 
  110. //對pipeline返回結果的處理方式,和前面代碼的處理方式完全一直,這里就不再重復給出了。 
  111. if (REDIS_OK != redisGetReply(c,(void**)&reply)) { 
  112. printf("Failed to execute command[%s] with Pipeline./n",command1); 
  113. freeReplyObject(reply); 
  114. redisFree(c); 
  115. freeReplyObject(reply); 
  116. printf("Succeed to execute command[%s] with Pipeline./n",command1); 
  117.  
  118. if (REDIS_OK != redisGetReply(c,(void**)&reply)) { 
  119. printf("Failed to execute command[%s] with Pipeline./n",command2); 
  120. freeReplyObject(reply); 
  121. redisFree(c); 
  122. freeReplyObject(reply); 
  123. printf("Succeed to execute command[%s] with Pipeline./n",command2); 
  124.  
  125. if (REDIS_OK != redisGetReply(c,(void**)&reply)) { 
  126. printf("Failed to execute command[%s] with Pipeline./n",command3); 
  127. freeReplyObject(reply); 
  128. redisFree(c); 
  129. freeReplyObject(reply); 
  130. printf("Succeed to execute command[%s] with Pipeline./n",command3); 
  131.  
  132. if (REDIS_OK != redisGetReply(c,(void**)&reply)) { 
  133. printf("Failed to execute command[%s] with Pipeline./n",command4); 
  134. freeReplyObject(reply); 
  135. redisFree(c); 
  136. freeReplyObject(reply); 
  137. printf("Succeed to execute command[%s] with Pipeline./n",command4); 
  138.  
  139. if (REDIS_OK != redisGetReply(c,(void**)&reply)) { 
  140. printf("Failed to execute command[%s] with Pipeline./n",command5); 
  141. freeReplyObject(reply); 
  142. redisFree(c); 
  143. freeReplyObject(reply); 
  144. printf("Succeed to execute command[%s] with Pipeline./n",command5); 
  145. //由于所有通過pipeline提交的命令結果均已為返回,如果此時繼續調用redisGetReply, 
  146. //將會導致該函數阻塞并掛起當前線程,直到有新的通過管線提交的命令結果返回。 
  147. //最后不要忘記在退出前釋放當前連接的上下文對象。 
  148. redisFree(c); 
  149. return; 
  150.  
  151. int main()  
  152. doTest(); 
  153. return 0; 
  154.  
  155. //輸出結果如下: 
  156. //Succeed to execute command[set stest1 value1]. 
  157. //The length of 'stest1' is 6. 
  158. //Succeed to execute command[strlen stest1]. 
  159. //The value of 'stest1' is value1. 
  160. //Succeed to execute command[get stest1]. 
  161. //Succeed to execute command[get stest2]. 
  162. //The value is value1. 
  163. //Succeed to execute command[mget stest1 stest2]. 
  164. //Begin to test pipeline. 
  165. //Succeed to execute command[set stest1 value1] with Pipeline. 
  166. //Succeed to execute command[strlen stest1] with Pipeline. 
  167. //Succeed to execute command[get stest1] with Pipeline. 
  168. //Succeed to execute command[get stest2] with Pipeline. 
  169. //Succeed to execute command[mget stest1 stest2] with Pipeline. 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产91成人在在线播放| 日韩在线视频播放| 精品丝袜一区二区三区| 欧美另类精品xxxx孕妇| 欧美成年人网站| 精品久久中文字幕久久av| 95av在线视频| 欧美日韩精品在线播放| 日韩中文字幕网| 亚洲第一精品自拍| 亚洲日韩第一页| 国产精品久久77777| 欧美日韩xxx| 国产亚洲精品美女久久久| www.久久久久久.com| 久久综合免费视频影院| www.亚洲男人天堂| 亚洲天堂男人的天堂| 久久精品视频在线观看| 日韩在线观看你懂的| 久久香蕉国产线看观看av| 日韩av在线网| 欧美成人在线免费视频| 亚洲xxx视频| 亚洲第一网站免费视频| 欧美插天视频在线播放| 日韩av一区在线观看| 伊人成人开心激情综合网| 亚洲国产精品99久久| 国产精品无码专区在线观看| 91欧美精品午夜性色福利在线| 亚洲成人激情图| 精品美女永久免费视频| 97在线视频一区| 欧美三级免费观看| 夜夜躁日日躁狠狠久久88av| 亚洲国产精品va在线观看黑人| 国产精品久久久| 国产综合在线视频| 欧美黄色www| 日韩高清a**址| 欧美精品国产精品日韩精品| 日本欧美中文字幕| 亚洲а∨天堂久久精品9966| 成人妇女淫片aaaa视频| 亚洲午夜精品久久久久久久久久久久| 亚洲人成五月天| 日本一区二三区好的精华液| 国产视频亚洲视频| 亚洲精品视频久久| 国产日本欧美一区| 日韩的一区二区| 伊人精品在线观看| 精品亚洲国产视频| 97久久超碰福利国产精品…| 奇米成人av国产一区二区三区| 69影院欧美专区视频| 亚洲一区二区三区乱码aⅴ| 日本精品在线视频| 欧美精品在线极品| 国产精品普通话| 欧美极品xxxx| 久久久免费av| 欧美精品久久久久久久久| 亚洲在线免费观看| 国产亚洲精品美女| 亚洲欧美一区二区精品久久久| 国产精品免费电影| 欧美老肥婆性猛交视频| 亚洲国产精品久久| 亚洲黄页网在线观看| 国产不卡av在线| 51精品国产黑色丝袜高跟鞋| 亚洲精品美女在线观看| 国产精品免费久久久久久| 成人精品视频在线| 欧美最近摘花xxxx摘花| 国产精品99蜜臀久久不卡二区| 国模视频一区二区| 日韩免费观看网站| 亚洲成人激情小说| 亚洲成人av片在线观看| 亚洲精品第一国产综合精品| 日韩中文字幕欧美| 久久精品视频网站| 九九热这里只有精品6| 欧美性极品少妇精品网站| 欧美裸身视频免费观看| 激情久久av一区av二区av三区| 欧美在线视频免费观看| 亚洲欧美国产精品久久久久久久| 亚洲已满18点击进入在线看片| 久久影视电视剧免费网站清宫辞电视| 欧美成人性生活| 欧美精品一区二区三区国产精品| 日韩美女免费线视频| 亚洲视频在线观看网站| 国产丝袜一区二区三区免费视频| 亚洲国产精品人久久电影| 5278欧美一区二区三区| 欧美亚洲另类在线| 久久久久www| 最近2019中文字幕大全第二页| 色爱精品视频一区| 欧美亚洲激情视频| 夜夜躁日日躁狠狠久久88av| 奇米成人av国产一区二区三区| 欧美影院久久久| 国产美女被下药99| 亚洲精美色品网站| 久久伊人91精品综合网站| 久久久精品久久久久| 中文字幕日韩视频| 在线视频精品一| 精品一区二区三区四区| 久久亚洲影音av资源网| 欧美人在线视频| 亚洲日韩欧美视频一区| 日韩av不卡在线| 精品国产美女在线| 亚洲曰本av电影| 国产成人精品一区| 久久影院免费观看| 精品毛片网大全| 97视频免费看| 成人午夜小视频| 国产区亚洲区欧美区| 国产精品福利片| 国产精品wwww| 久久九九全国免费精品观看| 亚洲激情 国产| 国产精品久久久久福利| 黑人巨大精品欧美一区二区一视频| 国产97人人超碰caoprom| 国产欧美日韩专区发布| 77777少妇光屁股久久一区| 成人黄色免费看| 夜夜嗨av一区二区三区四区| 亚洲成人免费在线视频| 一夜七次郎国产精品亚洲| 亚洲欧洲日产国码av系列天堂| 麻豆国产va免费精品高清在线| 久久精品亚洲94久久精品| 久久久欧美一区二区| 欧美午夜精品久久久久久久| 国产偷亚洲偷欧美偷精品| 北条麻妃99精品青青久久| 中文在线资源观看视频网站免费不卡| 久久人人看视频| 亚洲激情在线观看| www.日韩.com| 在线观看国产欧美| 精品国产乱码久久久久久虫虫漫画| 久久99青青精品免费观看| 亚洲国产又黄又爽女人高潮的| 91免费精品视频| 亚洲毛茸茸少妇高潮呻吟| 日韩欧美精品免费在线| 国产一区二区三区视频| 国产精品久久久久久中文字| 中文字幕日韩视频| 国产精品丝袜一区二区三区| 91精品视频在线看| 亚洲欧美三级伦理|