hiredis C API访问Redis
博客专区 > for_ 的博客 > 博客详情
hiredis C API访问Redis
for_ 发表于2年前
hiredis C API访问Redis
  • 发表于 2年前
  • 阅读 939
  • 收藏 3
  • 点赞 0
  • 评论 2

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: Linux下使用hiredis C API访问Redis

1. 目录结构

完成后的目录结构如下:

~/code$ tree redis/ -L 1 -d
redis/
├── hiredis
└── rediscli

2. 获取并编译 hiredis

从 github 获得 hiredis,然后执行make

~/code/redis$ git clone https://github.com/redis/hiredis.git
~/code/redis$ cd hiredis/
~/code/redis/hiredis$ make

3. C代码

// rediscli.c
#include <stdio.h>
#include <stdlib.h>
#include "../hiredis/hiredis.h"

int main(int argc, char *argv[]) {

    int j;
    char ip[] = "127.0.0.1";
    int port = 6379;
    redisContext *rc;
    redisReply *reply;

    // 连接Redis
    rc = redisConnect(ip, port);
    if (rc == NULL || rc->err) {
        if (rc) {
            printf("Connection error: %s\n", rc->errstr);
            redisFree(rc);
        } else {
            printf("Connection error: can't allocate redis context\n");
        }
        exit(1);
    }

    // PING 服务器
    reply = (redisReply *)redisCommand(rc, "PING");
    printf("PING: %s\n", reply->str);
    freeReplyObject(reply);

    // 设置key
    reply = (redisReply *)redisCommand(rc, "SET %s %s", "foo", "hello world");
    printf("SET: %s\n", reply->str);
    freeReplyObject(reply);

    // 使用二进制设置key
    reply = (redisReply *)redisCommand(rc, "SET %b %b", "bar", (size_t)3, "hello", (size_t)5);
    printf("SET (binary API): %s\n", reply->str);
    freeReplyObject(reply);
    
    // GET 
    reply = (redisReply *)redisCommand(rc, "GET foo");
    printf("GET foo: %s\n", reply->str);
    freeReplyObject(reply);

    // INCR counter
    reply = (redisReply *)redisCommand(rc, "INCR counter");
    printf("INCR counter: %lld\n", reply->integer);
    freeReplyObject(reply);

    // INCR counter
    reply = (redisReply *)redisCommand(rc, "INCR counter");
    printf("INCR counter: %lld\n", reply->integer);
    freeReplyObject(reply);

    //  mylist
    reply = (redisReply *)redisCommand(rc, "DEL mylist");
    free(reply);

    // 创建列表
    for (j = 0; j < 10; j++) {
        char buf[64];
        
        snprintf(buf, 64, "%u", j);
        reply = (redisReply *)redisCommand(rc, "LPUSH mylist element-%s", buf);
        freeReplyObject(reply);
    }

    // 获取列表
    reply = (redisReply *)redisCommand(rc, "LRANGE mylist 0 -1");
    if (reply->type == REDIS_REPLY_ARRAY) {
        for (j = 0; j < reply->elements; j++) {
            printf("%u) %s\n", j, reply->element[j]->str);
        }
    }
    freeReplyObject(reply);

    // 释放rc资源
    redisFree(rc);
}

4. Makefile

CC=gcc
ADDINCDIR=-I../hiredis 
ADDLIBDIR=-L../hiredis
ADDLIB=-lhiredis

all:rediscli.c
    $(CC) $(ADDINCDIR) $(ADDLIBDIR) rediscli.c -o rediscli $(ADDLIB)
clean:
    -rm rediscli

5. 运行

如果直接执行,会出现问题:

~/code/redis/rediscli$ make
gcc -I../hiredis  -L../hiredis rediscli.c -o rediscli -lhiredis
~/code/redis/rediscli$ ./rediscli 
./rediscli: error while loading shared libraries: libhiredis.so.0.13: cannot open shared object file: No such file or directory

hiredis生成和动态库 .so 和静态库 .a,优先链接到动态库 .so 。最简单粗暴的方式是删掉hiredis.so,这样就会链接到.a  文件了。(感觉可以用 gcc 的编译参数解决,以后琢磨一下)

解决

~/code/redis/rediscli$ rm ../hiredis/libhiredis.so
~/code/redis/rediscli$ make
gcc -I../hiredis  -L../hiredis rediscli.c -o rediscli -lhiredis
~/code/redis/rediscli$ ./rediscli 
PING: PONG
SET: OK
SET (binary API): OK
GET foo: hello world
INCR counter: 14
INCR counter: 15
0) element-9
1) element-8
2) element-7
3) element-6
4) element-5
5) element-4
6) element-3
7) element-2
8) element-1
9) element-0


标签: linux redis c
共有 人打赏支持
for_
粉丝 75
博文 47
码字总数 18257
评论 (2)
lelouch7
请问这个你是靠看hireids的源代码学习的么?我最近也在用hiredis,但是不知道该在哪里学习hiredis的使用。
for_

引用来自“lelouch7”的评论

请问这个你是靠看hireids的源代码学习的么?我最近也在用hiredis,但是不知道该在哪里学习hiredis的使用。
https://github.com/redis/hiredis/tree/master/examples
×
for_
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: