一:Redis 安装

2017-01-13 10:51:25来源:oschina作者:四月李人点击

第七城市

一、redis简介


  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.2https://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> ping
PONG
127.0.0.1:6379> set test hello
OK
127.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数据库


函数原型:


1redisContext *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 {
14char *host;
15char *source_addr;
16int port;
17 } tcp;
18
19 struct {
20char *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
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include //redis C接口库
8
9 #define REDIS_HOST "127.0.0.1"
10 #define REDIS_PORT 6379
11
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) {
20printf("connect redis server failure/n");
21return;
22 }
23 printf("redis connect sucess ip: %sport: %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) {
29printf("Redis Command error [%s]/n", cmd1);
30redisFree(c);
31return;
32 }
33 if (r->type == REDIS_REPLY_ERROR ) {
34printf("Redis Command[%s], error:%s/n", cmd1, r->str);
35freeReplyObject(r);
36redisFree(c);
37return;
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) {
46printf("Redis Command error [%s]/n", cmd2);
47redisFree(c);
48return;
49 }
50 if (r->type == REDIS_REPLY_ERROR ) {
51printf("Redis Command[%s], error:%s/n", cmd2, r->str);
52freeReplyObject(r);
53redisFree(c);
54return;
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 {
63printf("Failed to execute command[%s]/n", cmd3);
64freeReplyObject(r);
65redisFree(c);
66return;
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.1port: 6379
redis command execute success[set test hello]
get test value is: hello
The length of 'test' is 5.
[root@localhost 3rd]#
第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台