• linux下redis数据库的简单使用


    一、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.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> 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数据库

    函数原型:

    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        6379
     11 
     12 redisContext *g_ctx = NULL;
     13 
     14 int redis_init()
     15 {    
     16     redisContext *c = NULL;
     17     c = redisConnect(REDIS_HOST, REDIS_PORT);
     18     if (NULL == c || c->err) {
     19         if(c) {
     20             printf("Redis [%s:%d], Error:[%s]
    ", REDIS_HOST, REDIS_PORT, c->errstr);
     21             redisFree(c);
     22         } else {
     23             printf("Redis [%s:%d] failure
    ", REDIS_HOST, REDIS_PORT);
     24         }
     25         return -1;
     26     }
     27     g_ctx = c;
     28     
     29     return 0;
     30 }
     31 
     32 void redis_free()
     33 {
     34     if (g_ctx) {
     35         redisFree(g_ctx);
     36     }
     37     g_ctx = NULL;
     38 }
     39 
     40 int redis_test(const char *cmd)
     41 {
     42     int i = 0;
     43     redisReply *r = NULL;
     44     if (NULL == cmd) {
     45         return -1;
     46     }
     47 
     48     printf("%s
    ", cmd);
     49 
     50     r = (redisReply *)redisCommand(g_ctx, cmd);
     51     if (NULL == r) {
     52         printf("%s, Error[%d:%s]", g_ctx->err, g_ctx->errstr);
     53         return -1;
     54     }
     55 
     56     printf("type: %d
    ", r->type); 
     57     switch(r->type) {
     58     case REDIS_REPLY_STATUS:
     59         printf("type:%s, reply->len:%d reply->str:%s
    ", "REDIS_REPLY_STATUS", r->len, r->str);
     60         break;
     61     case REDIS_REPLY_ERROR:
     62         printf("type:%s, reply->len:%d reply->str:%s
    ", "REDIS_REPLY_ERROR", r->len, r->str);
     63         break;
     64     case REDIS_REPLY_INTEGER:
     65         printf("type:%s, reply->integer:%lld
    ", "REDIS_REPLY_INTEGER", r->integer);
     66         break;
     67     case REDIS_REPLY_NIL:
     68         printf("type:%s, no data
    ", "REDIS_REPLY_NIL");
     69         break;
     70     case REDIS_REPLY_STRING:
     71         printf("type:%s, reply->len:%d reply->str:%s
    ", "REDIS_REPLY_STRING", r->len, r->str);
     72         break;
     73     case REDIS_REPLY_ARRAY:
     74         printf("type:%s, reply->elements:%d
    ", "REDIS_REPLY_ARRAY", r->elements);
     75         for (i = 0; i < r->elements; i++) {
     76             printf("%d: %s
    ", i, r->element[i]->str);
     77         }
     78         break;
     79     default:
     80         printf("unkonwn type:%s
    ", r->type);
     81         break;
     82     }
     83  
     84     /*release reply and context */
     85     freeReplyObject(r); 
     86     return 0; 
     87 }
     88 
     89 int main()
     90 {
     91     const char *cmd = NULL;
     92 
     93     /* init redis */
     94     if (redis_init()) {
     95         return -1;
     96     }
     97 
     98     /* 1: SET<--->GET */
     99     printf("SET<--->GET
    ");
    100     cmd = "set foo bar";
    101     redis_test(cmd);
    102     cmd = "get foo";
    103     redis_test(cmd);
    104 
    105     /* 2: SADD<--->SMEMBERS */
    106     printf("
    SADD<--->SMEMBERS
    ");
    107     cmd = "SADD namelist jack lily lucy tom";
    108     redis_test(cmd);
    109     cmd = "SMEMBERS namelist";
    110     redis_test(cmd);
    111     
    112     /* 3: .....*/
    113     
    114     /* free redis context */
    115     redis_free();
    116     
    117     return 0;
    118 }

    运行结果:

    SET<--->GET
    set foo bar
    type: 5
    type:REDIS_REPLY_STATUS, reply->len:2 reply->str:OK
    get foo
    type: 1
    type:REDIS_REPLY_STRING, reply->len:3 reply->str:bar
    
    SADD<--->SMEMBERS
    SADD namelist jack lily lucy tom
    type: 3
    type:REDIS_REPLY_INTEGER, reply->integer:0
    SMEMBERS namelist
    type: 2
    type:REDIS_REPLY_ARRAY, reply->elements:4
    0: lucy
    1: jack
    2: lily
    3: tom
  • 相关阅读:
    在windows下安装mongodb(1)
    kettle过滤记录运用
    Robberies(简单的01背包 HDU2955)
    Alice and Bob(贪心HDU 4268)
    A Simple Problem with Integers(树状数组HDU4267)
    A Round Peg in a Ground Hole(凸包应用POJ 1584)
    Fishnet(暴力POJ 1408)
    Wall(凸包POJ 1113)
    Pipe(点积叉积的应用POJ1039)
    I love sneakers!(分组背包HDU3033)
  • 原文地址:https://www.cnblogs.com/wenqiang/p/5506744.html
Copyright © 2020-2023  润新知