文档章节

hiredis C API访问Redis

for。
 for。
发布于 2015/12/27 14:21
字数 545
阅读 969
收藏 3
点赞 0
评论 2

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的使用。
windows下vs2013使用C++访问redis

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

xumaojun ⋅ 04/29 ⋅ 0

CentOS编译swoole 的hiredis遇到的坑

在centos6.8的环境下,最开始编译swoole不带任何参数,没任何问题。今天在测试swoole的异步redis。编译hiredis后,再执行swoole相关测试脚本,总提示如下错误: 关于类似的问题,swoole官方文...

jichun ⋅ 05/06 ⋅ 0

开源企业级开发框架 - NodeWk

基于Sails.js MVC开发,实现常用的系统、微信、CMS等功能 PS:如果对Java开发框架感兴趣,可以看这里:https://gitee.com/wizzer/NutzWk 基于Sailsjs的Node.js开源企业级开发框架 NodeWk 1.0...

Wizzer ⋅ 2016/06/27 ⋅ 1

windows xp下redis客户端无法连接服务端(Could not connect to Redis at xxx:poll(2))

PR:https://github.com/MicrosoftArchive/redis/pull/598 错误描述与处理办法 用redis-cli连接服务端时,错误提示好像是Could not connect to Redis at xxx:poll(2),事实上使用微软的redis...

SK木眠 ⋅ 05/14 ⋅ 0

Redis使用总结(hiredis on windows in Microsoft Archive)

前段时间做的开发有缓存数据持久化的需求,最终采用了redis,实行效果还不错,聊做总结。 〇、技术选型 要解决问题首先要分析问题。应用角色是移动物联网平台OneNET和公司SCADA系统MQ中间件的...

SK木眠 ⋅ 05/15 ⋅ 0

Redis c/c++, java 客户端连接

Redis 介绍 redis 这个想必大家都了解,关于redis的安装参考这里,redis使用文档参见这里,英文文档。 Redis C客户端的使用方法 Redis的c客户端 Hiredis使用比较广泛,下面主要介绍下它。 1,...

gfsfg8545 ⋅ 2014/05/16 ⋅ 0

从hiredis使用出core谈谈redis多线程的使用【转】

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

TrevorKuo ⋅ 2015/09/02 ⋅ 0

从hiredis使用出core谈谈redis多线程的使用

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

jungleliu0923 ⋅ 2014/02/25 ⋅ 6

使用hiredis库的异步api时程序经常会崩溃,有同学遇到类似问题吗?

在做项目的时候要用到redish数据库,编程语言是C所以用到了hiredis库提供api来与redis-server通信,由于程序是作为服务器的,因此自然地使用了异步的方式。hiredis异步api的实现需要调用别的...

狼赶上羊 ⋅ 2015/01/23 ⋅ 0

Redis相关软件及源码

这是redis客户端软件外加源代码,可以在window下或者在linux下运动编译 https://github.com/cinience/RedisStudio/releases 2. hiredis是相当于c的redis的API https://github.com/redis/hire...

卜星星 ⋅ 2015/02/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

两道面试题,带你解析Java类加载机制

在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa{ static { System.out.println("爷爷在静态代码块"); }} cl...

1527 ⋅ 31分钟前 ⋅ 0

SpringCloud(Data Flow)

dataflow-server

赵-猛 ⋅ 42分钟前 ⋅ 0

深入理解Java虚拟机

这本书我读到第8章,之后就是在读不下去了。 读到后面是一种痛苦的体验,太多的东西是不全面的,大量的专有名词是没有解释的,读到最后很多东西仅仅是一个侧面,所以我觉得,这本书不适合初学...

颖伙虫 ⋅ 47分钟前 ⋅ 0

B树和B+树的总结

B树 为什么要B树 磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动。盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据的...

浮躁的码农 ⋅ 50分钟前 ⋅ 0

NanoPi NEO core/ Ubuntu16.04单网卡配置3个IP地址(2个静态,1个动态)

配置 root@NanoPi-NEO-Core:/etc/network# cat interfacesauto loiface lo inet loopbackallow-hotplug eth0iface eth0 inet static address 172.31.188.249 netmask 255.......

SamXIAO ⋅ 今天 ⋅ 0

三步为你的App集成LivePhoto功能

摘要:LivePhoto是iOS9新推出的一种拍照方式,类似于拍摄Gif图或录制视频片段生成图片。如果没有画面感,可以联想《哈利波特》霍格沃茨城堡的壁画,哈哈,很炫酷有木有,但坑爹的是只有iphone6S以...

壹峰 ⋅ 今天 ⋅ 0

centos7 git安装

由于centos中的源仓库中git不是最新版本,需要进行源码安装。 1、查看yum仓库git信息 [root@iZm5e3d4r5i5ml889vh6esZ zh]# yum info gitLoaded plugins: fastestmirrorLoading mirror s...

xixingzhe ⋅ 今天 ⋅ 0

input file 重复上传同一张图片失效的解决办法

解决办法 方法一:来回切换input[type='file']的type属性值,可以是‘text’,'button','button'....,然后再切换回来‘file’ 方法二:每次取消图片预览后,重置input[type='file']的value的...

时刻在奔跑 ⋅ 今天 ⋅ 0

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口;困难是因为我们不了解算法细节,很难去根...

xiaomin0322 ⋅ 今天 ⋅ 0

WampServer默认web服务器根目录位置

安装WampServer之后的web服务器根目录默认位置在WampServer安装目录下的www:

临江仙卜算子 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部