1、Redis简介
Redis是一个完全开源的key-value型数据库,其显著特点是基于内存操作,但是可以持久化到磁盘。相比较其他的数据库,Redis有着明显的优势,响应速度快和特性丰富是其明显的特点,其他的特点这里不一一赘述。
Redis有非常丰富的shell命令可以进行操作,关于shell相关命令网上有很多资料,本次不作详解。
关于Redis介绍和shell命令操作可以参考菜鸟教程和其他网上资料:
1、http://www.runoob.com/redis/redis-tutorial.html
2、《Redis命令参考手册完整版》
2、Redis移植
网上介绍linux下移植Redis资料很多,在SylixOS下开发同样需要进行移植工作。本文介绍Redis的编程接口,关于移植细节不做详细介绍。
SylixOS下使用Redis需要Redis-server程序和libredis.so库,在移植过程中会生成。在运行程序前需先运行redis-server,编译程序的时候要依赖libredis.so库。
3、相关接口介绍
Redis支持丰富的shell命令操作,下面介绍 Redis相关编程接口的使用:
1、连接数据库
redisContext *redisConnect(const char *ip, int port);
说明:该函数用来连接Redis数据库,参数为数据库的ip地址和端口,一般redis数据库的端口为6379,IP为127.0.0.1,该函数返回一个结构体redisContext,接下来的操作基于这个返回值句柄进行操作。
2、执行命令
void *redisCommand(redisContext *c, const char *format, ...);
说明:该函数执行相关redis库的命令,和Sqlite数据库类似,第一个参数为连接数据库时返回的redisContext,剩下的参数为变参,和printf函数类似。该返回值为void*,一般强制转换成为redisReply类型的进行进一步的处理,用返回值可判定函数的执行结果。
3、释放内存(执行命令时占用的内存)
void freeReplyObject(void *reply);
说明:该函数释放redisCommand执行后返回的redisReply所占用的内存,执行命令后应及时释放。
4、释放内存(连接数据库时占用的内存)
void redisFree(redisContext *c);
说明:释放redisConnect()所产生的连接,程序结束后应及时释放,防止内存泄漏。
下面介绍一个重要的结构体,在使用redisCommand函数操作命令时,根据返回值进行相关操作(执行不同的命令,返回的内容不同,可以通过结构体获取所需的内容,譬如执行get命令时,结构体中char * str可以表示get后的value值):
/* This is the reply object returned by redisCommand() */
typedef struct redisReply {
int type; /* REDIS_REPLY_* */
long long integer; /* The integer when type is REDIS_REPLY_INTEGER */
int len; /* Length of string */
char *str; /* Used for both REDIS_REPLY_ERROR and REDIS_REPLY_STRING */
size_t elements; /* number of elements, for REDIS_REPLY_ARRAY */
struct redisReply **element; /* elements vector for REDIS_REPLY_ARRAY */
} redisReply;
4、编程实例
下面为redis的编程实例,实例中以时间戳为key值,构造一个数组为value,示例代码如下:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdarg.h>
#include <string.h>
#include <assert.h>
#include <hiredis/hiredis.h>
redisContext* connect_redis ( void )
{
redisContext* redisContext_tbox = redisConnect("127.0.0.1", 6379);
if (redisContext_tbox->err) {
redisFree(redisContext_tbox);
printf("Connect to redisServer faile\n");
return NULL;
}
printf("Connect to redisServer Success\n");
return (redisContext_tbox);
}
int getLocalTime ( char *pcLocalTime )
{
time_t timep = 0;
struct tm *p = NULL;
time(&timep);
p = localtime(&timep); //取得当地时间
sprintf(pcLocalTime,
"%d%02d%02d%02d%02d%02d",
(1900 + p->tm_year),
(1 + p->tm_mon),
p->tm_mday,
p->tm_hour,
p->tm_min,
p->tm_sec);
return (0);
}
int main (int argc, char **argv)
{
int i = 0;
redisContext *redisContext_tbox = NULL;
redisReply *r = NULL;
char localtime[32] = { 0 };
char data[9] = { '1', '2', '3', '4', '5', '6', '7', '8', '\0' };
redisContext_tbox = connect_redis(); //和数据库服务器建立连接
r = (redisReply*) redisCommand(redisContext_tbox, "select 0"); //切换 0 号数据库
if ( NULL == r) {
printf("Execut setex failure\n");
redisFree(redisContext_tbox);
return (-1);
}
freeReplyObject(r);
for (i = 0; i < 5; i++) {
sleep(2);
getLocalTime(localtime); //获得系统时间
r = (redisReply*) redisCommand(redisContext_tbox, "set %s %s",
localtime,
data); //添加数据到数据库,40S后删除
if ( NULL == r) {
printf("Execut setex failure\n");
redisFree(redisContext_tbox);
return (-1);
}
freeReplyObject(r);
printf("set %s %s OK\n", localtime, data);
}
r = (redisReply*) redisCommand(redisContext_tbox, "dbsize"); //获取数据库大小
if ( NULL == r) {
printf("Execut get failure\n");
redisFree(redisContext_tbox);
return (-1);
}
printf("Succeed to execute dbsize,integer : %lld\n", r->integer);
freeReplyObject(r);
r = (redisReply*) redisCommand(redisContext_tbox, "select 1"); //切换 1 号数据库
if ( NULL == r) {
printf("Execut select failure\n");
redisFree(redisContext_tbox);
return (-1);
}
freeReplyObject(r);
for (i = 0; i < 5; i++) {
sleep(1);
getLocalTime(localtime); //获得系统时间
r = (redisReply*) redisCommand(redisContext_tbox, "set %s %s",
localtime, data); //添加数据到数据库,40S后删除
if ( NULL == r) {
printf("Execut setex failure\n");
redisFree(redisContext_tbox);
return (-1);
}
printf("set %s %s OK\n", localtime, data);
freeReplyObject(r);
}
r = (redisReply*) redisCommand(redisContext_tbox, "dbsize"); //获取数据库大小
if ( NULL == r) {
printf("Execut get failure\n");
redisFree(redisContext_tbox);
return (-1);
}
printf("Succeed to execute dbsize, integer : %lld\n", r->integer);
freeReplyObject(r);
redisFree( redisContext_tbox);
return (0);
}