前两篇文章(redis安装配置与测试、redis的数据类型)总计了redis的一些基本知识,这里要进行一下redis的实践,先介绍一个实际应用场景,对于客户频繁需要查询的信息,可以将其放在redis内存数据库中,相当于一个缓存,每次查的时候先去redis内存数据库中去查询,如果查询不到再去oracle数据库中查询,这样提高了效率。
本文,使用redis的C与语操作接口hiredis包装了redis数据库的增删改查以及连接和断开连接接口,可以用在实际应用中。
(一)hiredis介绍
hiredis提供了一linux下访问redis的接口,比如连接和操作redis数据库。这里介绍本文要使用的几个api,其他的可参考官网介绍
redisContext *redisConnect(const char *ip, int port); /*连接redis*/
void *redisCommand(redisContext *c, const char *format, ...); /*redis数据库操作 如SET GET AUTH等*/
void freeReplyObject(void *reply); /*释放redisCommand返回得到的结果结构体*
void redisFree(redisContext *c); /*释放连接上下文断开连接*/
hiredis中两种比较重要的结构体定义如下:
typedef struct redisContext
{
int err;
char errstr[128];
int fd;
int flags;
char *obuf;
redisReader *reader;
} redisContext;
typedef struct redisReply
{
int type;
long long integer;
int len;
char *str;
size_t elements;
struct redisReply **element;
} redisReply;
在调用redisConnect连接数据库时候,会返回一个redisContext结构体指针,可以看做是一个连接句柄,redisCommand需要用到该句柄。调用redisCommand返回一个redisReply指针(实际返回的类型是void*,需要显示的转换为redisReply*指针),指向的结构体包含了一些返回信息,如返回类型、返回值和长度等。
(二)hiredis使用
(1)连接redis
调用redisConnect连接redis数据库,得到一个redisContext*指针,如果连接失败,则结构体中的err和errstr被置值。连接成功则err为0。使用示例如下:
redisContext *c = NULL;
/*connect*/
c = redisConnect(ip, port);
(2)操作redis
使用redisCommand,该接口返回一个void*指针,显式转换为redisReply*指针,指向的结构中包含了一些返回信息,比较重要的是返回类型,代表了返回结果的类型。使用示例如下:
redisReply *reply = NULL;
reply = (redisReply *)redisCommand(c, "GET %s", key);
reply->type表明了返回的类型,常见的类型如下:
REDIS_REPLY_STATUS:
返回了命令执行状态,状态信息可以由reply-> str获得。AUTH命令和SET命令正常情况下返回该值, reply-> str为OK。
REDIS_REPLY_ERROR:
表示执行出现了一个错误
REDIS_REPLY_INTEGER:
返回了一个整数,整数值由eply->integer表示。例如DEL操作,如果key存在,正常情况下返回该类型,表示键的个数。
REDIS_REPLY_NIL:
返回了nil。 表示无相应数据,例如GET不存在的key。
REDIS_REPLY_STRING:
表示命令执行后返回了一个字符串。 返回的字符串使用reply-> str来获取。 这