linux下redis数据库的简单使用 含有redisContext redisReply结构体定义

来源:互联网 发布:如何申请淘宝签约商户 编辑:程序博客网 时间:2024/06/11 14:38

linux下redis数据库的简单使用

一、redis简介    http://www.cnblogs.com/wenqiang/p/5506744.html

  Redis是一个key-value存储系统。和 Memcached类似,但是解决了断电后数据完全丢失的情况,而且她支持更多无化的value类型,除了和string外,还支持lists(链表)、 sets(集合)和zsets(有序集合)几种数据类型。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作, 而且这些操作都是原子性的。

二、redis的安装

首先从在官网下载redis源码安装包,下载地址:https://github.com/antirez/redis.git

目前最新分支为3.2

1 git clone -b 3.2  https://github.com/antirez/redis.git

下载完成之后进入redis目录,编译安装直接是

make

make install

编译安装完成直接运行

redis-server就可以启用redis服务,可以用netstat命令查看redis监听的端口(默认是6379)

redis服务起来之后我就可以进行相应的测试看数据库是否安装成功:

在命令行输入redis-cli启用redis客户端:

输入一下命令测试redis是否安装成功

复制代码
127.0.0.1:6379> pingPONG127.0.0.1:6379> set test helloOK127.0.0.1:6379> get test"hello"127.0.0.1:6379>
复制代码


更多redis命令请参考redis命令手册,这上面详细介绍了redis-cli各种命令的用法

http://doc.redisfans.com/

至此,redis数据库安装完成

三、redis c 接口库的安装

  Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便

  在这里简单介绍一下redis的C接口库:

hiredis是redis的C接口库,使用之前我们要先下载安装hiredis,下载地址:https://github.com/redis/hiredis.git

git clone https://github.com/redis/hiredis.git


下载之后进入hiredis目录

make

make install

下面进行hredis库中几个常用函数介绍

(1)redisConnect函数

该函数用于连接redis数据库

函数原型:

1  redisContext *redisConnect(const char *ip, int port);2 //说明:该函数用来连接redis数据库,参数为数据库的ip地址和端口,一般redis数据库的端口为6379该函数返回一个结构体redisContext。

redisContext结构体定义如下:

复制代码
 1 /* Context for a connection to Redis */ 2 typedef struct redisContext { 3     int err; /* Error flags, 0 when there is no error */ 4     char errstr[128]; /* String representation of error when applicable */ 5     int fd;  6     int flags; 7     char *obuf; /* Write buffer */ 8     redisReader *reader; /* Protocol reader */ 9 10     enum redisConnectionType connection_type;11     struct timeval *timeout;12 13     struct {14         char *host;15         char *source_addr;16         int port;17     } tcp;18 19     struct {20         char *path;21     } unix_sock;22 23 } redisContext;
复制代码

(2)redisCommand函数

该函数用于执行redis的命令;

函数原型:

1 void *redisCommand(redisContext *c, const char *format, ...);2 /*说明:该函数执行命令,就如sql数据库中的SQL语句一样,只是执行的是redis数据库中的操作命令,3 第一个参数为连接数据库时返回的redisContext,4 后面为可变参数列表,跟C语言printf函数类似,5 返回值为void*,一般强制转换成为redisReply类型的进行进一步的处理。*/

用法:

redisReply *reply = (redisReply*)redisCommand(c,   cmd);

redisReply结构体定义如下:

复制代码
1 /* This is the reply object returned by redisCommand() */2 typedef struct redisReply {3     int type; /* REDIS_REPLY_* */4     long long integer; /* The integer when type is REDIS_REPLY_INTEGER */5     size_t len; /* Length of string */6     char *str; /* Used for both REDIS_REPLY_ERROR and REDIS_REPLY_STRING */7     size_t elements; /* number of elements, for REDIS_REPLY_ARRAY */8     struct redisReply **element; /* elements vector for REDIS_REPLY_ARRAY */9 } redisReply;
复制代码

下面是几种redis的常见错误及返回值类型

复制代码
 1 #define REDIS_ERR -1 2 #define REDIS_OK 0 3 #define REDIS_ERR_IO 1 /* Error in read or write */ 4 #define REDIS_ERR_EOF 3 /* End of file */ 5 #define REDIS_ERR_PROTOCOL 4 /* Protocol error */ 6 #define REDIS_ERR_OOM 5 /* Out of memory */ 7 #define REDIS_ERR_OTHER 2 /* Everything else... */ 8      9 #define REDIS_REPLY_STRING 1   //返回字符串,查看str,len字段10 #define REDIS_REPLY_ARRAY 2    //返回一个数组,查看elements的值(数组个数),通过element[index]的方式访问数组元素,每个数组元素是一个redisReply对象的指针11 #define REDIS_REPLY_INTEGER 3  //返回整数,从integer字段获取值12 #define REDIS_REPLY_NIL 4      //没有数据返回13 #define REDIS_REPLY_STATUS 5   //表示状态,内容通过str字段查看,字符串长度是len字段14 #define REDIS_REPLY_ERROR 6    //表示出错,查看出错信息,如上的str,len字段
复制代码

(3)redisRelpyObject函数

还函数用于释放redisCommand返回值redisReply所占用的内存

1 /* Free a reply object */2 void freeReplyObject(void *reply)3 //该函数用于回收释放redisCommand返回值redisReply所占用的内存

(4)redisFree函数

该函数用于释放一个redis数据库的连接

1 void redisFree(redisContext *c)2 //用于释放redisConnect产生的连接

下面写一个简单的hredis c接口的redis测试程序:

复制代码
 1 #include <stdio.h> 2 #include <string.h> 3 #include <stddef.h>   4 #include <stdarg.h>   5 #include <string.h>   6 #include <assert.h>   7 #include <hiredis/hiredis.h> //redis C接口库 8  9 #define REDIS_HOST        "127.0.0.1"10 #define REDIS_PORT        637911 12 void redis_cli()13 {14     redisContext *c = NULL;15     redisReply      *r = NULL;16 17     /*连接redis数据库*/18     c = redisConnect(REDIS_HOST, REDIS_PORT);19     if(NULL == c) {20         printf("connect redis server failure\n");21         return;22     }23     printf("redis connect sucess ip: %s  port: %d\n", REDIS_HOST, REDIS_PORT);24 25     /*test为key, hello为vlaue*/26     char *cmd1 = "set test hello";27     r = (redisReply*)redisCommand(c, cmd1);28     if (NULL == r) {29         printf("Redis Command error [%s]\n", cmd1);30         redisFree(c);  31         return;32     }   33     if (r->type == REDIS_REPLY_ERROR ) { 34         printf("Redis Command[%s], error:%s\n", cmd1, r->str);35         freeReplyObject(r);36         redisFree(c);  37         return;38     }  39     printf("redis command execute success[%s]\n", cmd1);40     freeReplyObject(r);//释放redisCommand返回值replsy所占用的内存41 42     /*获取test的值*/43     char *cmd2 = "get test";44     r = (redisReply*)redisCommand(c, cmd2);45     if (NULL == r) {46         printf("Redis Command error [%s]\n", cmd2);47         redisFree(c);  48         return;49     }   50     if (r->type == REDIS_REPLY_ERROR ) { 51         printf("Redis Command[%s], error:%s\n", cmd2, r->str);52         freeReplyObject(r);53         redisFree(c);  54         return;55     }  56     printf("get test value is: %s\n", r->str);57     freeReplyObject(r);58 59     const char* cmd3 = "strlen test";  60     r = (redisReply*)redisCommand(c, cmd3);  61     if ( r->type != REDIS_REPLY_INTEGER)  62     {  63         printf("Failed to execute command[%s]\n", cmd3);  64         freeReplyObject(r);  65         redisFree(c);  66         return;  67     }68     printf("The length of 'test' is %d.\n", r->integer);       69     freeReplyObject(r); 70     71     /*释放数据库连接*/ 72     redisFree(c);  73     return;74 }75 76 int main(int argc, char **argv)77 {78     redis_cli();79     80     return 0;81 }
复制代码

运行结果:

复制代码
[root@localhost 3rd]# ./test redis connect sucess ip: 127.0.0.1  port: 6379redis command execute success[set test hello]get test value is: helloThe length of 'test' is 5.[root@localhost 3rd]#
1 0