redis编程(hredis)
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()所产生的连接。
下面用一个简单的例子说明:
- #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;
- }
#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)相关推荐
- Redis(含Redis安装,CMD命令,使用Redis编程,缓存预热,计划任务)
Redis中文官网: Redis中文网https://www.redis.net.cn/ Redis 安装教程( Windows 版) 1. 下载安装包 https://robinliu.3322.o ...
- Redis基础,Linux下安装Redis和hredis,C++调用Redis,Redis中字符串设计
文章目录 一.Redis是什么 Redis架构 Redis优势 Redis应用场景 二.Linux下载安装Redis(Ubuntu系统) 了解Redis版本 在线安装Redis 启动Redis服务端 ...
- php redis linsert,LINSERT命令_视频讲解_用法示例-redis编程词典-php中文网
insert 英 [ɪnˈsɜ:t] 美 [ɪnˈsɜ:rt] vt.插入;嵌入;(在文章中)添加;加插 n.插入物;添入物(尤指一页印刷品图中插入或套印的小图);(书报的)插页;添加物 第三人称 ...
- php redis mset,MSET命令_视频讲解_用法示例-redis编程词典-php中文网
set 英 [set] 美 [sɛt] vt.设置;放置,安置;使处于某种状况;摆放餐具 vi.落山;出发;凝结 n.集合;一套,一副;布景;电视机 adj.固定的;位于-的;顽固的;安排好的 第 ...
- php redis编程,php + redis 实现关注功能
原文:https://www.cnblogs.com/laowenBlog/p/14192070.html 产品价值 应用场景 在做PC或者APP端时,掺杂点社交概念就有关注和粉丝功能; 数据量小的话 ...
- php hsetnx,HSETNX命令_视频讲解_用法示例-redis编程词典-php中文网
set 英 [set] 美 [sɛt] vt.设置;放置,安置;使处于某种状况;摆放餐具 vi.落山;出发;凝结 n.集合;一套,一副;布景;电视机 adj.固定的;位于-的;顽固的;安排好的 第 ...
- php rpoplpush,RPOPLPUSH命令_视频讲解_用法示例-redis编程词典-php中文网
pop 英 [pɒp] 美 [pɑ:p] vi.(意外地.突然地)出现;突然出现;发出爆裂声;(突然地)行动 vt.(突然地)伸出;(突然地)提出问题;(把准备好的东西)突然拿出来;敲击 n.流行 ...
- hset php,HSET命令_视频讲解_用法示例-redis编程词典-php中文网
set 英 [set] 美 [sɛt] vt.设置;放置,安置;使处于某种状况;摆放餐具 vi.落山;出发;凝结 n.集合;一套,一副;布景;电视机 adj.固定的;位于-的;顽固的;安排好的 第 ...
- php srem,SREM命令_视频讲解_用法示例-redis编程词典-php中文网
英 [s'rem] 美 [s'rem] abbr.sleep with rapid eye movements 睡觉时眼睛急动 redis SREM命令 语法 作用:移除集合 key 中的一个或多 ...
最新文章
- R语言应用str_match函数和str_match_all函数从字符串抽取匹配的字符串模式:str_match函数抽取第一个匹配的字符串模式、str_match_all函数抽取多个匹配的字符串模式
- [记录]mscorlib recursive resource lookup bug解决方法
- IOS 输入框 placeholder字体的颜色
- Could not close the output stream for file hdfs://192.168.190.129:9000/BJ_4.c
- xml与oracle对比,Oracle XML DB和DB2 pure XML在XML文档存储查询性能方面的比较分析
- Activiti手动执行的应用(UserTask)
- mac 下的实用工具总结
- windows系统清理磁盘临时文件,及缓冲文件,及离线文件和空闲文件
- 教你恢复电脑被删的照片或视频,方法实用可收藏
- Pixhawk原生固件PX4之调节怠速
- ppt转html5原理,如何实现PPT转成H5?
- zigbee三种组网形式及终端、路由、协调器理解
- 软件项目工程中应该编写的十三类文档
- 胡子决定编程语言运势[转载]
- Switch新机发布引全球吐槽,老任给牙膏厂上了一课,这波是等等党输了
- office常用技巧总结【word篇】
- Python经典编程习题100例:第20例:落体反弹问题
- 【转载】亡灵对抗人类的一点战术
- 雷军:创业者要牢记的两个关键词
- 一键ghost【onekey ghost】最新版本下载,一键ghost官网