文档章节

hiredis C API访问Redis

for。
 for。
发布于 2015/12/27 14:21
字数 545
阅读 981
收藏 3

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


© 著作权归作者所有

共有 人打赏支持
for。

for。

粉丝 80
博文 47
码字总数 18257
作品 0
深圳
程序员
加载中

评论(2)

for。
for。

引用来自“lelouch7”的评论

请问这个你是靠看hireids的源代码学习的么?我最近也在用hiredis,但是不知道该在哪里学习hiredis的使用。
https://github.com/redis/hiredis/tree/master/examples
lelouch7
lelouch7
请问这个你是靠看hireids的源代码学习的么?我最近也在用hiredis,但是不知道该在哪里学习hiredis的使用。
从hiredis使用出core谈谈redis多线程的使用

在实际工作中,我需要使用redis的客户端去连接redis,于是选择了hiredis客户端(公司强推)。 hiRedis 是 Redis 官方指定的 C 语言客户端开发包,支持 Redis 完整的命令集、管线以及事件驱动编...

jungleliu0923
2014/02/25
0
6
hiredis-win32+libevent

决定用redis作为cache服务器,要求其服务端和客户端都支持跨平台win和linux 但我发现redis(/作者)对windows态度极差,不考虑,不支持 微软公司的闲人们主动靠过去,推出win版。这么一来,r...

雅各宾
2013/07/25
0
0
windows下vs2013使用C++访问redis

刚开始在windows下使用c++访问reids各种报错,经过网上到处搜方案,终于可以在windows下访问redis了, 特将注意事项记录下来: 1.获取redis Window下的开发库源码,从github获取 windows版:...

xumaojun
04/29
0
0
为什么会有Memlink? redis

为什么会有Memlink? 对于大型论坛服务,比如百度贴吧、天涯论坛,日均发帖量过百万或千万,日均PV过亿,日积月累下来的帖子数量可能几十亿到上百亿。这种超级论坛,其海量存储、海量访问都是...

玄觉
2013/04/21
0
0
Redis,GetStart on windows

redis 一个可扩展的高性能的nosql数据库,越来越多的产品在使用它,redis是目前只能在linux下编译,这么好的东西肯定会有人移植到window平台的,点击msopentech移植的版本. 这里先说一下测试环境...

Injection
2013/06/04
0
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

人生苦短:Python里的17个“超赞操作

人生苦短,我选Python”。那么,你真的掌握了Python吗? 1. 交换变量 有时候,当我们要交换两个变量的值时,一种常规的方法是创建一个临时变量,然后用它来进行交换。比如: # 输入 a = 5 b ...

糖宝lsh
48分钟前
4
0
咕泡-spring中常用设计模式概述

设计模式就是经验之谈,供后人借鉴,解决一些具有代表性的问题 设计模式来源于生活,反过来帮助我们更好生活 设计模式提升代码的可读性、可扩展性、维护成本、复杂业务问题 千万不要死记硬背...

职业搬砖20年
今天
2
0
day59-20180817-流利阅读笔记-待学习

假·照骗,真·社交焦虑 雪梨 2018-08-17 1.今日导读 发朋友圈之前,不少人为了展现更美好的生活状态会对照片加以“微调”,或是加个滤镜显得逼格更高,或是磨个皮瘦个脸拉个大长腿。现在,国...

aibinxiao
今天
23
0
OSChina 周五乱弹 —— 姑娘在这个节日里表白你接受么?

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @Sharon啊:完全被这个小姐姐圈粉了,学两首她的歌去哈哈 分享王贰浪的单曲《往后余生(翻自 马良)》 《往后余生(翻自 马良)》- 王贰浪 手...

小小编辑
今天
1K
17
为什么HashMap要自己实现writeObject和readObject方法?

为什么HashMap要自己实现writeObject和readObject方法? 如果你有仔细阅读过HashMap的源码,那么你一定注意过一个问题:HashMap中有两个私有方法。 private void writeObject(java.io.Objec...

DemonsI
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部