文档章节

hiredis C API访问Redis

for。
 for。
发布于 2015/12/27 14:21
字数 545
阅读 987
收藏 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。

粉丝 84
博文 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

没有更多内容

加载失败,请刷新页面

加载更多

区块链教程以太坊源码分析core-state源码分析(一)

兄弟连区块链教程以太坊源码分析core-state源码分析,core/state 包主要为以太坊的state trie提供了一层缓存层(cache) database主要提供了trie树的抽象,提供trie树的缓存和合约代码长度的缓...

兄弟连区块链入门教程
4分钟前
0
0
使用putty上传文件

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: 使用putty上传文件 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::linux 用户名 set linux_us......

shzwork
6分钟前
0
0
摹客首家发布Adobe XD插件

10月19日,摹客iDoc发布了支持Adobe XD的插件,这是中国国内首款基于Adobe XD 正式API的插件。 设计师在Adobe XD 中安装并使用此插件,可以将设计稿上传到摹客iDoc,并使用iDoc的全部协作设计...

mo311
6分钟前
0
0
MetInfo最新网站漏洞如何修复以及网站安全防护

metinfo漏洞于2018年10月20号被爆出存在sql注入漏洞,可以直接拿到网站管理员的权限,网站漏洞影响范围较广,包括目前最新的metinfo版本都会受到该漏洞的攻击,该metinfo漏洞产生的主要原因是...

网站安全
6分钟前
0
0
git统计代码行数

$ npm install -g cloc$ cloc . 2193 text files. 1533 unique files. 760 files ignored.github.com/AlDanial/cloc v 1.78 ......

moon888
6分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部