文档章节

hiredis C API访问Redis

开源中国首席划水狮
 开源中国首席划水狮
发布于 2015/12/27 14:21
字数 545
阅读 1.3K
收藏 3

码上生花,ECharts 作品展示赛正式启动!>>>

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


© 著作权归作者所有

开源中国首席划水狮

开源中国首席划水狮

粉丝 90
博文 47
码字总数 18257
作品 0
深圳
程序员
私信 提问
加载中
此博客有 2 条评论,请先登录后再查看。
hiredis — Redis 的 C 语言客户端

目录 文章目录 目录 Redis 客户端 HIREDIS 安装 验证 Synchronous API redisConnect redisCommand freeReplyObject redisFree Pipelining Errors Redis 客户端 Redis 拥有几乎所有主流编程语......

范桂飓
05/27
0
0
区分Python的redis客户端:hiredis、hiredis-py、redis-py

由于学习《Redis实战》用的是Python,需要按Python的redis客户端库。被几个库搞得有点晕,在此区分一下。 区分hiredis、hiredis-py、redis-py redis官网Github:https://github.com/redis,这...

煲煲菜
2019/09/29
0
0
memlink性能测试、与redis,mysql的性能测试对比

这是来自 memlink 官方上的一份测试报告,首先得发表一下个人意见,nosql 拿来跟 mysql 做性能比较是不厚道的。 Introduction Memlink用于存储Key=>List数据,下面对比了不同数据存储引擎存储...

红薯
2011/04/12
6.9K
4
从hiredis使用出core谈谈redis多线程的使用

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

jungleliu0923
2014/02/25
4.2K
6
Redis的C语言客户端(hiredis)的安装和使用

关键词:hiredis, cRedis, redis clients, redis客户端, C客户端, 华为云分布式缓存服务 hiredis是一个非常全面的C语言版redis接口库,支持所有命令、管道与脚本。华为云分布式缓存服务Redis...

osc_jor8x3el
2018/07/09
14
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot单元测试配置

##SpringBoot进行单元测试 ####需要的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><excl......

RandomObject
33分钟前
17
0
看了同事的代码,我忍不住写了这份代码指南

❝ 作者:xybaby 链接:https://www.cnblogs.com/xybaby/p/11335829.html ❞ 前言 写出整洁的代码,是每个程序员的追求。《clean code》指出,要想写出好的代码,首先得知道什么是肮脏代码、...

osc_fvp5wdwk
41分钟前
24
0
Flutter基础篇(2)-- 老司机用一篇博客带你快速熟悉Dart语法

版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.jianshu.com/p/3d927a7bf020 转载请标明出处: https://www.jianshu.com/p/3d927a7bf020 本文出自 AWeiLoveAndroid的博客...

osc_dg21zk4i
42分钟前
18
0
如何在小程序制作表单活动?

比起纸质的表单,电子版表单更加受市场的青睐,尤其是随着越来越多的东西都被赋予了营销属性,不只是只有广告才能够做宣传,比如说表单也不仅仅只是一个收集信息的工具,我们对表单加以包装,...

osc_9bje7o1h
43分钟前
10
0
Intel x710万兆 SR-IOV 网卡驱动升级

目录 文章目录 目录 环境 获取最新驱动 安装 环境 CentOS7 Intel x710 获取最新驱动 官方地址:https://downloadcenter.intel.com/zh-cn/product/83967/Intel-Ethernet-Converged-Network-A...

osc_b9r67jnt
44分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部