redis的C/C++ API

hiredis不支持集群。支持集群的API:

C++  https://github.com/eyjian/r3c
C++  https://github.com/zhengshuxin/acl

C    https://github.com/vipshop/hiredis-vip.git

这里简单测试一下hiredis-vip。

2. hiredis-vip:
hiredis-vip是基于hiredis的(事实上,它包含一个完整的hiredis),在hiredis的基础上,提供了一套cluster版本的接口。

安装: 由于hiredis-vip包含了完整的hiredis,在安装hiredis-vip之前,先卸载前面安装的hiredis。
# rm -fr /usr/local/include/hiredis/
# rm -f /usr/local/lib/libhiredis.*

安装hiredis-vip
# wget https://github.com/vipshop/hiredis-vip/archive/master.zip
# unzip master.zip
# cd hiredis-vip-master/
# make
# vim Makefile (更改INSTALL_LIBRARY_PATH,免得受系统环境变量LIBRARY_PATH影响);
INSTALL_LIBRARY_PATH=/usr/local/lib/hiredis-vip
# make install
现在,头文件安装于/usr/local/include/hiredis-vip目录,包含hiredis.h,hircluster.h等;lib文件安装于/usr/local/lib/hiredis-vip目录,主要是libhiredis_vip.so;为了方便,设置一下头文件和lib文件的路径:

# vim ~/.bashrc
#compile time, paths to search included headers, referenced libs;
export C_INCLUDE_PATH=.:/usr/local/include/hiredis-vip:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=.:/usr/local/include/hiredis-vip:$CPLUS_INCLUDE_PATH
export LIBRARY_PATH=.:/usr/local/lib/hiredis-vip:$LIBRARY_PATH
 
 
#runtime, paths to search referenced libs;
export LD_LIBRARY_PATH=.:/usr/local/lib/hiredis-vip:$LD_LIBRARY_PATH

2.1 hiredis-vip sync API

#include<stdio.h>
#include<hircluster.h>
 
int main()
{
    redisClusterContext *cc = redisClusterConnect("127.0.0.1:7000,127.0.0.1:7001",HIRCLUSTER_FLAG_NULL);
    if(cc == NULL || cc->err)
    {
        printf("connect error : %s\n", cc == NULL ? "NULL" : cc->errstr);
        return -1;
    }
 
    int i;
    redisReply* reply = NULL;
 
    for(i=0; i<10000; i++)
    {
      //set
      reply = redisClusterCommand(cc, "set key%d value%d", i, i);
      if(reply == NULL)
      {
        printf("set key%d, reply is NULL, error info: %s\n", i, cc->errstr);
        redisClusterFree(cc);
        return -1;
      }
      printf("set key%d, reply:%s\n", i, reply->str);
      freeReplyObject(reply);
 
      //get
      reply = redisClusterCommand(cc, "get key%d", i);
      if(reply == NULL)
      {
        printf("get key%d, reply is NULL, error info: %s\n", i, cc->errstr);
        redisClusterFree(cc);
        return -1;
      }
      printf("get key%d, reply:%s\n", i, reply->str);
      freeReplyObject(reply);
    }
 
    redisClusterFree(cc);
    return 0;
}

编译运行:

<pre name="code" class="plain"># gcc -lhiredis_vip sync.c
# ./a.out
......
set key9998, reply:OK
get key9998, reply:value9998
set key9999, reply:OK
get key9999, reply:value9999

2.2 hiredis-vipi async API

#include<stdio.h>
#include<hircluster.h>
#include<adapters/libevent.h>
 
int all_count=0;
 
void getCallback(redisClusterAsyncContext *acc, void *r, void *privdata)
{
    redisReply *reply = r;
    int count =  *(int*)privdata;
    all_count ++;
    if(all_count >= count)
    {
        redisClusterAsyncDisconnect(acc);
    }
}
 
void connectCallback(const redisAsyncContext *c, int status)
{
    if (status != REDIS_OK) {
        printf("Error: %s\n", c->errstr);
        return;
    }
    printf("Connected...\n");
}
 
void disconnectCallback(const redisAsyncContext *c, int status)
{
    if (status != REDIS_OK) {
        printf("Error: %s\n", c->errstr);
        return;
    }
 
    printf("\nDisconnected...\n");
}
 
int main(int argc, char **argv)
{
    int status;
    struct event_base *base = event_base_new();
    redisClusterAsyncContext *acc = redisClusterAsyncConnect("127.0.0.1:7001,127.0.0.1:7001",HIRCLUSTER_FLAG_NULL);
    if (acc->err)
    {
        printf("Error: %s\n", acc->errstr);
        return 1;
    }
    redisClusterLibeventAttach(acc,base);
    redisClusterAsyncSetConnectCallback(acc,connectCallback);
    redisClusterAsyncSetDisconnectCallback(acc,disconnectCallback);
 
    int count = 10000;
    int i;
    for(i = 0; i < 10000; i ++)
    {
        status = redisClusterAsyncCommand(acc, getCallback, &count, "set %d %d", i, i);
        if(status != REDIS_OK)
        {
            printf("error: %d %s\n", acc->err, acc->errstr);
        }
    }
 
    event_base_dispatch(base);
    return 0;
}

编译运行:
# gcc -lhiredis_vip -levent async.c
# ./a.out
Connected...
Connected...
Connected...
 
Disconnected...
 
Disconnected...
 
Disconnected...

--------------------- 
作者:for_tech 
来源:CSDN 
原文:https://blog.csdn.net/for_tech/article/details/51917831 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C++语言中调用Redis,可以使用RedisC++客户端库。以下是使用Redis C++客户端库的一些基本步骤: 1. 首先,确保你已经安装了Redis,并且可以正常运行。 2. 下载并安装Redis C++客户端库。推荐使用hiredis库,它是一个基于C的库,提供了与Redis交互的API。你可以从官方GitHub仓库下载并编译安装该库。 3. 在你的C++项目中包含Redis C++客户端库的头文件。 4. 连接到Redis服务器。使用hiredis库,你可以使用以下代码连接到Redis服务器: ```cpp #include <hiredis/hiredis.h> int main() { redisContext* redis = redisConnect("localhost", 6379); if (redis == NULL || redis->err) { if (redis) { printf("Error: %s\n", redis->errstr); redisFree(redis); } else { printf("Can't allocate redis context\n"); } return 1; } // 连接成功,可以进行后续操作 // ... // 关闭连接 redisFree(redis); return 0; } ``` 5. 在连接成功后,你可以使用hiredis库提供的API执行各种Redis命令。例如,以下代码演示了如何执行SET和GET命令: ```cpp redisReply* reply = (redisReply*)redisCommand(redis, "SET key value"); freeReplyObject(reply); reply = (redisReply*)redisCommand(redis, "GET key"); if (reply->type == REDIS_REPLY_STRING) { printf("GET key: %s\n", reply->str); } freeReplyObject(reply); ``` 这里的`redisCommand`函数用于执行Redis命令,并返回一个`redisReply`对象,你可以通过检查其`type`字段来确定返回值的类型,然后获取相应的值。需要注意的是,使用完`redisReply`对象后,需要使用`freeReplyObject`函数释放它。 除了SET和GET命令,Redis还支持其他各种命令(例如HSET、HGET、LPUSH、LPOP等),你可以根据自己的需求使用适当的命令。 总之,以上是在C++语言中调用Redis的基本步骤。你可以根据具体情况和需求,使用Redis C++客户端库执行各种操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值