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;
}
结果示例: