代码编织梦想

cli中使用sadd key data1 data2的时候,查询到的是两个数据,有时候我们需要data1和data2为一个数据,比如 sadd key  "hello world",在命令中使用双引号将hello world包起来即可,

但是在c++调用的hiredis接口的时候却实现不了

使用redisCommandArgv即可解决。

#include <string>
#include "hiredis/hiredis.h"
#include <vector>


int main() 
{
    redisContext *ctx = redisConnect("127.0.0.1", 6379);
    if (ctx->err) 
    {
        printf("connection fail\n");
        redisFree(ctx);
        return -1;
    }

    std::string a("SET");
    std::string b("foo");
    std::string c("12345");

    std::vector<const char*> s_vec;
    s_vec.push_back(a.c_str());
    s_vec.push_back(b.c_str());
    s_vec.push_back(c.c_str());

    redisReply *reply = (redisReply *)redisCommandArgv(ctx, s_vec.size(), &(s_vec[0]), NULL);
    freeReplyObject(reply);

    reply = (redisReply *)redisCommand(ctx, "GET foo");
    printf("GET foo: %s\n", reply->str);
    freeReplyObject(reply);

    std::string cmd("SADD");
    std::string key("key");
    std::string context("hello world");

    std::vector<const char *> argv;
    std::vector<std::size_t> arg_len;
    argv.reserve(10);
    arg_len.reserve(10);

    argv.emplace_back(cmd.c_str());
    argv.emplace_back(key.c_str());
    argv.emplace_back(context.c_str());
    arg_len.emplace_back(cmd.size());
    arg_len.emplace_back(key.size());
    arg_len.emplace_back(context.size());

    reply = (redisReply *)redisCommandArgv(ctx, argv.size(), &(argv[0]), NULL);
    if(NULL == reply)
    {
        printf("%s fail.\n", "SADD");
        return -1;
    }

    if (reply->type == REDIS_REPLY_ERROR) 
    {
        printf("%s reply fail\n", reply->str);
        return -1;
    }

    if(reply->integer == 1)
    {
        printf("success\n");
    }

    freeReplyObject(reply);


    std::string get_cmd = "SMEMBERS " + key;
    printf("Get CMD = %s\n", get_cmd.c_str());
    reply = (redisReply *)redisCommand(ctx, get_cmd.c_str());
    if(NULL == reply)
    {
        printf("%s fail.\n", cmd);
        return -1;
    }


    if(reply->type != REDIS_REPLY_ARRAY)
    {
      printf("%s reply fail\n", get_cmd.c_str());
      freeReplyObject(reply);
      return -1;
    }

    int elements_cnt = reply->elements;
    printf("SMEMBERS watch elements cnt is %d\n", elements_cnt);
    printf("SMEMBERS watch\n");
    for(int i = 0; i < elements_cnt; i++)
    {
        printf("%s\n", reply->element[i]->str);
    }

    freeReplyObject(reply);
    redisFree(ctx);

    return 0;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/misterdo/article/details/129669885

linux下安装redis 3.0及c语言中客户端实现demo-爱代码爱编程

1、获取安装文件 wget http://download.redis.io/redis-stable.tar.gz 2、解压文件 tar xzvf redis-stable.tar.gz 3、进入目录 cd redis-stable 4、编译 make 5、安装 make install 6、设置配置文件路径 mkdir -p /e

基于hiredis封装hmset命令-爱代码爱编程

关于hiredis中执行HMSET,当被设置的field中包含空格时,使用redisCommand的格式进行传入将会被截断,这是需使用redisCommandArgv来进行操作,一下代码为对redisCommandArgv进

c++使用hiredis库操作redis讲解-爱代码爱编程

       做服务端开发基本都会用到redis,java调用redis就简单了,教程很多,库也都是现成的,多数会选择jedis库吧,但是c++调用redis就麻烦一点,基本都要自己编译才行。虽然支持c++的redis库也很多,但是用哪个呢?找了一下资料,发现hiredis库大家用的比较多,于是在开发过程中用了一下。还谈不上多深入,本文只讲些简单用法。

windows下使用hiredis各种常见问题(折磨死人了)-爱代码爱编程

Windows下使用hiredis各种常见问题(折磨死人了) 不得不说,对一个小白来说,刚摸索的过程很痛苦,所以在此给大家把一些常见问题给列出来,方便后面各位新手学习少走弯路,各位大神请轻喷。 1.还是按照其他人的方式先

使用hiredis lpush 一个带空格的json字符串到redis 会被分隔成多段的问题-爱代码爱编程

今天遇到标题所示问题,花了将近一天终于找到了原因,原来是在执行命令前使用了 sprintf 函数导致的, redis 命令里面的字符串还是挺奇怪的,和我们平时的不一样,使用前如果命令里面有空格字符 谨记千万慎重使用sprintf 这样的函数,一般对应的库中都会有自己的格式化函数,最好用库里面带的,就这样,记录一下。 char szCommand[1

hiredis中调用eval出错_光1314光的博客-爱代码爱编程

在使用hiredis的时候发现直接使用cmd调用eval的时候内嵌lua脚本会产生错误, char cmd[] = "eval \"local a=redis.call('get',KEYS[1]);if a~='1' then redis.call('set',KEYS[1],'1');return 1;else return 0;end\" 1 Use

使用redis客户端hiredis遇到的一些问题_weixin_33725722的博客-爱代码爱编程

2019独角兽企业重金招聘Python工程师标准>>> 在使用Redis客户端hiredis处理redis的命令时,当key或者value中包括空格时,遇到命令执行失败的问题。 具体情况如下: #include <hiredis/hiredis.h> int mai

redis使用_假装程序员的第xxx天的博客-爱代码爱编程

1、安装和配置 环境:Ubuntu16.04 sudo apt-get install redis-server #安装 redis-server #启动 redis-cli #打开客户端,此时可以执行操作了,默认没有密码。 select 0 #选择0号数据库 #客户端与Redis建立连接后会自动选择0号数据库 config set

使用hiredis实现redis分布式锁-爱代码爱编程

简言 1. redis实现分布式锁的原理,这里不再赘述,不清楚的可以参见笔者的这篇博客 https://blog.csdn.net/yzf279533105/article/details/100524700 2. 解锁时使用lua脚本,由于hiredis是根据空格来解析cmd参数的,但是lua中肯定有空格,所以解锁的redis命令要分开格式化 3

第05课:Redis 实际应用中的异常场景及其根因分析和解决方案-爱代码爱编程

上一篇较为详细地介绍了基于 Redis 的分布式缓存实现方案,解决了 “怎么用” 的问题。但是,在实际应用中,异常场景时有出现,作为一名攻城狮,仅仅“会用”是不够的,还需要能够定位、解决实际应用中出现的异常问题。 本文将介绍一组 Redis 实际应用中遇到的异常场景,如 Redis 进程无法拉起、故障倒换失败、Slot 指派失败等,并针对这些异常场景给出

Redis 学习 - hiredis(官网 2021-01-06)-爱代码爱编程

目录 Hiredis1. Hiredis简介IMPORTANT: Breaking changes from `0.14.1` -> `1.0.0` (一些更改)2. Synchronous API(同步API)2.1 Connecting(连接)2.2 Sending commands(发送命令)2.3 Using replies(使用回复

clion使用cmake导入redis源码3.0和6.0版本-爱代码爱编程

redis源码导入clion 文章目录 redis源码导入clion背景环境redis3.0redis-3.0源码目录结构CMakeLists.txt的编写,在相应目录创建CMakeLists.txt根目录depsdeps/hiredisdeps/jemallocdeps/linenoisedeps/luareload项目redis6.0fork

【hiredis】使用select命令切换redis数据库返回“err unknown command select”-爱代码爱编程

概述 因为程序架构需要,数据存入Redis需要分不同数据库。Redis操作库使用hiredis 环境信息 服务器:两台Linux服务器 Redis版本:3.2.9 ,配置了主从模式 开发语言: C/C++ 问题 调

jvm监控搭建-爱代码爱编程

文章目录 JVM监控搭建整体架构JolokiaTelegrafInfluxdbGrafana JVM监控搭建 整体架构 JVM 的各种内存信息,会通过 JMX 接口进行暴露。 Jolokia