redis的C接口

Redis简介

        远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。


Redis的优点

1)读写速度快,支持高并发。

2)机器重启后,重新加载模式,不会丢失数据。

3)支持主从模式复制,支持分布式。

4)丰富的数据类型。

5)所有操作都是原子性的。

6)支持Publish/Subscribe等特性。


Redis的缺点

1)数据库容量受到物理内存的限制,不能实现海量数据的高性能读/写。

2)没有原生的可扩展机制,不具有自身可扩展能力,要依赖客户端来实现分布式读/写。

3)disk-backed持久化功能,跟传统意义上的持久化有比较大的区别。

4)适合的场景主要局限在较小数据量的高性能操作和运算上。

5)存储结构相对简单,不能处理复杂的逻辑关系。

6)不支持复杂逻辑查询。


适用场景:

1)在非可靠数据存储中,可以作为数据持久层或者数据缓存区。

2)对于读/写压力比较大,实时性要求比较高的场景下。

3)关系型数据库不能胜任的场景(订阅关系)。
 

接口程序包部署:

wget https://github.com/redis/hiredis/archive/refs/heads/master.zip

unzip master.zip

cd master

make && make install

接口相关函数

接口连接

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

参数:

        ip:redis的IP

        port:redis的端口

返回值结构体内的相关内容(连接句柄)

typedef struct redisContext 
{
    		int err; /* 连接错误为0 */
    		char errstr[128]; /* 错误提示,解释 */
    		int fd;
    		int flags;
    		char *obuf; /*写内存*/
    		redisReader *reader; /* 协议 */
    		enum redisConnectionType connection_type;
    		struct timeval *timeout;

    		struct {

        				char *host;
        				char *source_addr;
        				int port;
    				} tcp;

    		struct {

        				char *path;
    				} unix_sock;
} redisContext;

指令执行

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

参数:

        参数1:句柄

        参数2:redis指令

返回值结构体内的相关内容(指令句柄)

typedef struct redisReply 
{
    int type; /* REDIS_REPLY_*结果类型*/
    long long integer; /*整数类型结果*/
    size_t len; /* str的长度 */
    char *str; /* 正确结果或错误解释 */
    size_t elements; /*数组结果元素个数*/
    struct redisReply **element; /*元素内容*/
} redisReply;

释放内存

void freeReplyObject(void *reply);

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

参数:命令句柄

释放连接

void redisFree(redisContext *c);

功能:释放redisConnect()所产生的连接

参数:连接句柄

demo1:

                1.建立redis接口

                2.交互式输入命令,接收命令结果

                3..q退出连接

代码示例:

#include </root/hiredis-master/hiredis.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void result()
{
        int i;
        char buf[128] = {'\0'};
        redisContext *con = redisConnect("127.0.0.1",6379);
        if(con->err)
        {
                printf("connect redis error,why : %s\n",con->errstr);
                exit(-1);
                redisFree(con);
        }
        redisReply *reply = redisCommand(con,"auth 123456");
        freeReplyObject(reply);
        while(1)
        {
                memset(buf,'\0',128);
                printf(">>>");
                fgets(buf,128,stdin);
                for(i = 0;i < 128;i++)
                {
                        if(buf[i] == '\n')
                        {
                                buf[i] = '\0';
                        }
                }
                if(buf[0] == '.' && buf[1] == 'q')
                {
                        break;
                }
                reply = redisCommand(con,buf);
                printf("========================\n");
                if(reply->len != 0)
                {
                        printf("%s\n",reply->str);
                        reply->str = NULL;
                }
                else if(reply->elements != 0)
                {
                        for(i = 0;i < reply->elements;i++)
                        {
                                if(reply->element[i]->str == NULL)
                                {
                                        printf("(nil)\n");
                                        continue;
                                }
                                printf("%s\n",reply->element[i]->str);
                        }
                }
                else if(reply->integer != 0)
                {
                        printf("(integer) %d\n",reply->integer);
                }
                else
                {
                        printf("(nil) OR (integer) 0\n");
                }
                printf("========================\n");
                freeReplyObject(reply);
        }
        redisFree(con);
}


int main()
{
        result();
        return 0;
}

结果示例:

 demo2:

                1.指令写入文件(批量执行)

                2.执行指令,并反馈结果

代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include </root/hiredis-master/hiredis.h>

redisContext *con;
redisReply *reply;
char command[128] = {'\0'};
int fd;

void connect_redis()
{
        con = redisConnect("127.0.0.1",6379);
        if(con->err)
        {
                printf("connect redis error,why : %s\n",con->errstr);
                redisFree(con);
        }
        reply = redisCommand(con,"auth 123456");
        freeReplyObject(reply);
}


void  redis_commamd_input()
{
        int i;
        reply = redisCommand(con,command);
        if(reply->len != 0)
        {
                printf("%s\n",reply->str);
                reply->str = NULL;
        }
        else if(reply->elements != 0)
        {
                for(i = 0;i < reply->elements;i++)
                {
                        if(reply->element[i]->str == NULL)
                        {
                                printf("(nil)\n");
                                continue;
                        }
                        printf("%s\n",reply->element[i]->str);
                }
        }
        else if(reply->integer != 0)
        {
                printf("(integer) %d\n",reply->integer);
        }
        else
        {
                printf("(nil) OR (integer) 0\n");
        }
        freeReplyObject(reply);
}

void result()
{
        int size;
        char *buf = NULL;
        int i;
        int k;
        int j = 0;
        fd = open("/root/test",O_RDWR);
        if(fd == -1)
        {
                printf("open file fail\n");
                exit(-1);
        }
        size = lseek(fd,0,SEEK_END);
        buf = (char *)malloc(size);
        lseek(fd,0,SEEK_SET);
        read(fd,buf,size);
        for(i = 0;i < size;i++)
        {
                if(*(buf+i) == '\n' || *(buf+i) == '\r')
                {
                        *(buf+i) = ' ';
                }
        }
        connect_redis();
        for(i = 0;i < size;i++)
        {
                if(*(buf+i) == ';' )
                {
                        if(command[0] == ' ' && command[1] == ' ')
                        {
                                for(k = 0;k < 128;k++)
                                {
                                        command[k] = command[k+2];
                                }
                        }
                        printf("%s\n",command);
                        redis_commamd_input(command);
                        memset(command,'\0',128);
                        j = 0;
                        i = i + 1;
                }
                command[j] = *(buf+i);
                j++;
        }
        redisFree(con);
        close(fd);
}

int main()
{
        result();
        return 0;
}

结果示例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值