hiredis是redis数据库的C接口,目前只能在linux下使用,几个基本的函数就可以操作redis数据库了 。

函数原型:redisContext *redisConnect(const char *ip, int port)

说明:该函数用来连接redis数据库,参数为数据库的ip地址和端口,一般redis数据库的端口为6379

该函数返回一个结构体redisContext。

函数原型:void *redisCommand(redisContext *c, const char *format, ...);

说明:该函数执行命令,就如sql数据库中的SQL语句一样,只是执行的是redis数据库中的操作命令,第一个参数为连接数据库时返回的redisContext,剩下的参数为变参,就如C标准函数printf函数一样的变参。返回值为void*,一般强制转换成为redisReply类型的进行进一步的处理。

函数原型void freeReplyObject(void *reply);

说明:释放redisCommand执行后返回的redisReply所占用的内存

函数原型:void redisFree(redisContext *c);

说明:释放redisConnect()所产生的连接。

下面用一个简单的例子说明:

[cpp] view plain copy print ?
  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/hiredis.h>
  8. void doTest()
  9. {
  10. //redis默认监听端口为6387 可以再配置文件中修改
  11. redisContext* c = redisConnect("127.0.0.1", 6379);
  12. if ( c->err)
  13. {
  14. redisFree(c);
  15. printf("Connect to redisServer faile\n");
  16. return ;
  17. }
  18. printf("Connect to redisServer Success\n");
  19. const char* command1 = "set stest1 value1";
  20. redisReply* r = (redisReply*)redisCommand(c, command1);
  21. if( NULL == r)
  22. {
  23. printf("Execut command1 failure\n");
  24. redisFree(c);
  25. return;
  26. }
  27. if( !(r->type == REDIS_REPLY_STATUS && strcasecmp(r->str,"OK")==0))
  28. {
  29. printf("Failed to execute command[%s]\n",command1);
  30. freeReplyObject(r);
  31. redisFree(c);
  32. return;
  33. }
  34. freeReplyObject(r);
  35. printf("Succeed to execute command[%s]\n", command1);
  36. const char* command2 = "strlen stest1";
  37. r = (redisReply*)redisCommand(c, command2);
  38. if ( r->type != REDIS_REPLY_INTEGER)
  39. {
  40. printf("Failed to execute command[%s]\n",command2);
  41. freeReplyObject(r);
  42. redisFree(c);
  43. return;
  44. }
  45. int length =  r->integer;
  46. freeReplyObject(r);
  47. printf("The length of 'stest1' is %d.\n", length);
  48. printf("Succeed to execute command[%s]\n", command2);
  49. const char* command3 = "get stest1";
  50. r = (redisReply*)redisCommand(c, command3);
  51. if ( r->type != REDIS_REPLY_STRING)
  52. {
  53. printf("Failed to execute command[%s]\n",command3);
  54. freeReplyObject(r);
  55. redisFree(c);
  56. return;
  57. }
  58. printf("The value of 'stest1' is %s\n", r->str);
  59. freeReplyObject(r);
  60. printf("Succeed to execute command[%s]\n", command3);
  61. const char* command4 = "get stest2";
  62. r = (redisReply*)redisCommand(c, command4);
  63. if ( r->type != REDIS_REPLY_NIL)
  64. {
  65. printf("Failed to execute command[%s]\n",command4);
  66. freeReplyObject(r);
  67. redisFree(c);
  68. return;
  69. }
  70. freeReplyObject(r);
  71. printf("Succeed to execute command[%s]\n", command4);
  72. redisFree(c);
  73. }
  74. int main()
  75. {
  76. doTest();
  77. return 0;
  78. }
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdarg.h>
#include <string.h>
#include <assert.h>
#include <hiredis/hiredis.h>void doTest()
{//redis默认监听端口为6387 可以再配置文件中修改redisContext* c = redisConnect("127.0.0.1", 6379);if ( c->err){redisFree(c);printf("Connect to redisServer faile\n");return ;}printf("Connect to redisServer Success\n");const char* command1 = "set stest1 value1";redisReply* r = (redisReply*)redisCommand(c, command1);if( NULL == r){printf("Execut command1 failure\n");redisFree(c);return;}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);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); redisFree(c);}int main()
{doTest();return 0;
}

执行结果为:

分割线

------------------------------------------------------------------------

hiRedis操作同步API的接口函数只需下面三个即可:

redisContext*redisConnect(const char *ip, int port);

void*redisCommand(redisContext *c, const char *format, ...);

voidfreeReplyObject(void *reply);

1. 连接(Connecting)

redisconnect函数创建一个redisContext类型的数据结构,用于保存与服务器端的连接状态。redisContext 结构有一个整数类型的err域,当该值非零时表示连接有错,并表示错误类型。 更多错误信息请参考Errors部分。因此,当使用redisconnect函数连接Redis时,需要判断err域,检查建立连接是否成功。

redisContext *c = redisConnect("127.0.0.1", 6379);
if (c->err) {
    printf("Error: %s\n", c->errstr);
    // handle error
}

2. 发送命令(Send Commands)

hiRedis有多种方式发送命令给Redis。其中,第一个方法是使用redisCommand。该函数的原型与printf很相似。最简单的形式,我们可以如下使用redisCommand:

reply = redisCommand(context, "SET foo bar");

也可以使用像printf的格式化方法,插入字符串,如下:

reply = redisCommand(context, "SET foo %s", value);

当需要在命令中传递一个二进制安全的字符串时,可以使用%b,一个字符串指针,和size_t类型的字符串长度。

reply = redisCommand(context, "SET foo %b", value, valuelen);

3. 使用replies

当命令成功执行时,redisCommand的返回值保存一个reply;而当有错误产生时,返回NULL,并且设置context中的err域。当有错误产生时,连接不可再用,需要重新创建一个连接。

redisCommand返回的标准的replies为redisReply类型。RedisReply类型的type域用于保存客户端接收到的是哪钟类型的reply:

  • REDIS_REPLY_STATUS:

命令返回一个status。status 字符串可以使用reply->str访问,字符串长度使用reply->len访问

  • REDIS_REPLY_ERROR:

命令返回一个error。error字符串访问同status。

  • REDIS_REPLY_INTEGER:

命令返回一个整数。整数值可以使用reply->integer域访问,类型为long long。

  • REDIS_REPLY_NIL

命令返回一个nil对象,表示访问数据不存在

  • REDIS_REPLY_STRING

命令返回一个字符串对象。访问同status。

  • REDIS_REPLY_ARRAY

命令返回一个数组对象。数组元素个数保存在reply->elements,数组中的每个元素都是一个redisReply对象,可以通过reply->element[…index…]访问。Redis支持嵌套数组。

最后,需要调用freeReplyObject()函数释放Replies。该函数会自动释放数组或嵌套数组的sub-replies 对象,因此不需要手动释放sub-replies。

4. 断开连接

为了断开连接和释放context,需要调用如下函数:

void redisFree(redisContext *c);

该函数会立即关闭socket,然后释放context创建时的分配内容。

redis编程(hredis)相关推荐

  1. Redis(含Redis安装,CMD命令,使用Redis编程,缓存预热,计划任务)

    Redis中文官网: Redis中文网https://www.redis.net.cn/ Redis 安装教程( Windows 版) 1. 下载安装包 https://robinliu.3322.o ...

  2. Redis基础,Linux下安装Redis和hredis,C++调用Redis,Redis中字符串设计

    文章目录 一.Redis是什么 Redis架构 Redis优势 Redis应用场景 二.Linux下载安装Redis(Ubuntu系统) 了解Redis版本 在线安装Redis 启动Redis服务端 ...

  3. php redis linsert,LINSERT命令_视频讲解_用法示例-redis编程词典-php中文网

    insert 英 [ɪnˈsɜ:t]   美 [ɪnˈsɜ:rt] vt.插入;嵌入;(在文章中)添加;加插 n.插入物;添入物(尤指一页印刷品图中插入或套印的小图);(书报的)插页;添加物 第三人称 ...

  4. php redis mset,MSET命令_视频讲解_用法示例-redis编程词典-php中文网

    set 英 [set]   美 [sɛt] vt.设置;放置,安置;使处于某种状况;摆放餐具 vi.落山;出发;凝结 n.集合;一套,一副;布景;电视机 adj.固定的;位于-的;顽固的;安排好的 第 ...

  5. php redis编程,php + redis 实现关注功能

    原文:https://www.cnblogs.com/laowenBlog/p/14192070.html 产品价值 应用场景 在做PC或者APP端时,掺杂点社交概念就有关注和粉丝功能; 数据量小的话 ...

  6. php hsetnx,HSETNX命令_视频讲解_用法示例-redis编程词典-php中文网

    set 英 [set]   美 [sɛt] vt.设置;放置,安置;使处于某种状况;摆放餐具 vi.落山;出发;凝结 n.集合;一套,一副;布景;电视机 adj.固定的;位于-的;顽固的;安排好的 第 ...

  7. php rpoplpush,RPOPLPUSH命令_视频讲解_用法示例-redis编程词典-php中文网

    pop 英 [pɒp]   美 [pɑ:p] vi.(意外地.突然地)出现;突然出现;发出爆裂声;(突然地)行动 vt.(突然地)伸出;(突然地)提出问题;(把准备好的东西)突然拿出来;敲击 n.流行 ...

  8. hset php,HSET命令_视频讲解_用法示例-redis编程词典-php中文网

    set 英 [set]   美 [sɛt] vt.设置;放置,安置;使处于某种状况;摆放餐具 vi.落山;出发;凝结 n.集合;一套,一副;布景;电视机 adj.固定的;位于-的;顽固的;安排好的 第 ...

  9. php srem,SREM命令_视频讲解_用法示例-redis编程词典-php中文网

    英 [s'rem]   美 [s'rem] abbr.sleep with rapid eye movements 睡觉时眼睛急动 redis SREM命令 语法 作用:移除集合 key 中的一个或多 ...

最新文章

  1. R语言应用str_match函数和str_match_all函数从字符串抽取匹配的字符串模式:str_match函数抽取第一个匹配的字符串模式、str_match_all函数抽取多个匹配的字符串模式
  2. [记录]mscorlib recursive resource lookup bug解决方法
  3. IOS 输入框 placeholder字体的颜色
  4. Could not close the output stream for file hdfs://192.168.190.129:9000/BJ_4.c
  5. xml与oracle对比,Oracle XML DB和DB2 pure XML在XML文档存储查询性能方面的比较分析
  6. Activiti手动执行的应用(UserTask)
  7. mac 下的实用工具总结
  8. windows系统清理磁盘临时文件,及缓冲文件,及离线文件和空闲文件
  9. 教你恢复电脑被删的照片或视频,方法实用可收藏
  10. Pixhawk原生固件PX4之调节怠速
  11. ppt转html5原理,如何实现PPT转成H5?
  12. zigbee三种组网形式及终端、路由、协调器理解
  13. 软件项目工程中应该编写的十三类文档
  14. 胡子决定编程语言运势[转载]
  15. Switch新机发布引全球吐槽,老任给牙膏厂上了一课,这波是等等党输了
  16. office常用技巧总结【word篇】
  17. Python经典编程习题100例:第20例:落体反弹问题
  18. 【转载】亡灵对抗人类的一点战术
  19. 雷军:创业者要牢记的两个关键词
  20. 一键ghost【onekey ghost】最新版本下载,一键ghost官网

热门文章

  1. Java - Calendar对于特殊夏令营日期的处理(防止采坑)
  2. java expires_java 中Cookie设置Expires的问题
  3. nin神经网络_NIN网络解析
  4. [自学用]kurtosis
  5. 邻居好多用万能钥匙连我家WiFi的,我家的网速变得太慢,怎么才能避免?
  6. CardView详解
  7. CLion工具(cmake) 快速开始
  8. CLion 2022,CMake构建进度
  9. 服务提供者无法注册到nacos服务器
  10. Python包装用户指南(删减了讨论和新闻部分)