【1】cpp_redis (Windows C++ Redis客户端)(C++11实现)官方最新源码编译
正文如下
reply

reply是cpp_redis访问redis服务返回的唯一类型,该类型可以包含各种情况下的服务端数据。

reply的结构
namespace cpp_redis {class reply {private:type m_type;std::vector<cpp_redis::reply> m_rows;std::string m_strval;int64_t m_intval;
};

普通情况下单个值放到m_strval或者m_intval中

之所以能够包含各种类型的返回结果,是因为该结构为递归结构m_rows为vector<reply>;最终都会以一个string或者int存放

取得reply中存放的值

reply中有点类似C++中的union类型,或者Rapidjson中的Value类型,也就是符合类型。所以当你取值的时候最好要判断一下,如果取错了类型会抛异常。

当然,自己放进去的值如果自己清楚,也不用判断,直接取值。直接取值的话用下面的函数从reply中得到对应的值:

  const std::vector<reply>& as_array(void) const;const std::string& as_string(void) const;int64_t as_integer(void) const;

1 as_string() 得到reply中保存的m_strval值

2 as_integer() 得到reply中保存的m_intval值

3 as_array() 得到reply中保存的vector<reply>;再对vector中的每个reply调用as_string取得m_strval字符串,或者对vector中的每个reply调用as_integer取得m_intval整数;如果多层结构,就继续增加内循环取出数据。

4 如果一个key在redis中不存在,请求返回的值类型为空值。

bool
reply::is_null(void) const {return m_type == type::null;
}

5 返回多个值的时候某些key如果在redis中不存在:

如果请求返回的是vector<reply>那一定是因为你请求的时候发送的是#mget("name", vector<string> many_keys).此时返回的vector<reply>中,某些reply可能因为你发送的key在redis中并不存在而为上面的空值。

6 从空值中取数据之前要先判断才能取(避免不必要的异常发生)

bool
reply::is_array(void) const {return m_type == type::array;
}bool
reply::is_string(void) const {return is_simple_string() || is_bulk_string() || is_error();
}bool
reply::is_simple_string(void) const {return m_type == type::simple_string;
}bool
reply::is_bulk_string(void) const {return m_type == type::bulk_string;
}bool
reply::is_error(void) const {return m_type == type::error;
}bool
reply::is_integer(void) const {return m_type == type::integer;
}

下面的例子以往redis中的hash容器存取数据为例,完整的展示了上面提到的内容:

#include <cpp_redis/cpp_redis>
#include <iostream>
#include <utility>
#include "TestRedis.h"
using namespace std;#ifdef _WIN32
#include <Winsock2.h>
#endif /* _WIN32 */
#pragma comment( lib, "ws2_32.lib")//最好的方法是包含在项目属性中,因为那样可以根据Debug、Release、x86、x64来区分。这里仅仅是为了突出引用了这个库写在这里 bool StartWSA(void)
{//! Windows netword DLL initWORD version = MAKEWORD(2, 2);WSADATA data;if (WSAStartup(version, &data) != 0){std::cerr << "WSAStartup() failure" << std::endl;return false;}return true;
}
void StopWSA(void)
{WSACleanup();
}int main(void)
{//启动Windows网络通信库if (!StartWSA()){return -1;}try{//! Enable loggingcpp_redis::active_logger = std::unique_ptr<cpp_redis::logger>(new cpp_redis::logger);cpp_redis::redis_client client;client.connect("127.0.0.1", 6379, [](cpp_redis::redis_client&){std::cout << "client disconnected (disconnection handler)" << std::endl;});vector<pair<string, string>> vecPair = { {"key1", "value1"},{ "key2", "value2" }, {"key3", "value3"} };client.hmset("hash", vecPair);vector<string> vecKey = { "key1", "key2", "key4" };client.hmget("hash", vecKey, [](cpp_redis::reply& _reply){for each (auto& var in _reply.as_array()){if (var.is_string()){cout << var.as_string() << endl;}}});// synchronous commit, no timeoutclient.sync_commit();}catch (cpp_redis::redis_error e){std::cout << e.what() << endl;}//关闭Windows网络通信库StopWSA();return 0;
}

运行结果:

我们创建了3个key,取的时候故意取了一个不存在的key4,所以返回的结果是nill。这时候我们对返回的vector<reply>每个元素都做了is_string()判断,如果不判断就会抛出异常,这个时候使用异常就没必要了(代码结构不清晰)。

【5】cpp_redis reply相关推荐

  1. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 完整代码示例 )

    文章目录 前言 一.Android 端完整代码示例 二.Flutter 端完整代码示例 三.相关资源 前言 前置博客 : [Flutter]Flutter 混合开发 ( Flutter 与 Nativ ...

  2. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 MethodChannel 通信 )

    文章目录 前言 一.Android 端 MethodChannel 构造函数 二.Android 端 setMethodCallHandler 方法 三.Android 端实现 MethodChann ...

  3. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 BasicMessageChannel 通信 )

    文章目录 前言 一.Android 端 BasicMessageChannel 构造函数 二.Android 端 MessageCodec 子类实现 三.Android 端 setMessageHan ...

  4. 用户空间与内核空间数据交换的方式(9)------netlink【转】

    转自:http://www.cnblogs.com/hoys/archive/2011/04/10/2011722.html Netlink 是一种特殊的 socket,它是 Linux 所特有的,类 ...

  5. 从零单排学Redis【黄金】

    前言 好的,今天我们要上黄金段位了,如果还没经历过青铜和白银阶段的,可以先去蹭蹭经验再回来: 从零单排学Redis[青铜] 从零单排学Redis[白银] 看过相关Redis基础的同学可以知道Redis ...

  6. 【PHP】curl_init() 如何排错????

    文章目录 场景 期望 问题 解决思路 考虑超时重试情况: 考虑DNS缓存: 输出curl_error($ch); 最终结果 扩展链接 其他错误解决方法: SSL: no alternative cer ...

  7. oracle ipc message,【案例】Oracle RAC IPC send timeout error导致RAC的节点挂起解决办法

    天萃荷净 Oracle研究中心案例分析:运维DBA反映Oracle RAC环境数据库节点挂起,分享日志发现是由于IPC send timeout error导致RAC的节点挂起. 本站文章除注明转载外 ...

  8. 【Linux】一步一步学Linux——read命令(220)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 附录 01. 命令概述 read命令用于从标准输入读取数值.read 内部命令被用 ...

  9. 【Linux】一步一步学Linux——arping命令(164)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 附录 01. 命令概述 arping命令作用是使用arp数据包,通过ping命令检 ...

最新文章

  1. TriggerMesh开源用于多云环境的Knative Event Sources
  2. 2-结构体的最后一个成员的定义-C语言中的柔性数组-
  3. 59. 螺旋矩阵 II(模拟)
  4. Git学习——提交BUG
  5. mysql数据库ip地址_MySQL数据库存储IP地址的方法
  6. Apache+php+mysql安装与配置详解
  7. java 对象 转换 工具类_Java中excel与对象的互相转换的通用工具类编写与使用(基于apache-poi-ooxml)...
  8. 十大 Node.js 的 Web 框架,快速提升工作效率
  9. 腾讯滑块验证码识别和加速度模拟(1)
  10. Swiper 触屏滑动切换
  11. Python学习手册--第一部分(使用入门)
  12. python UI自动化(一)
  13. Typora恢复忘记保存的文件
  14. 怎么用c语言解三元二次方程组,三元二次方程组解法
  15. 一些基于 D3.js 的图表库
  16. 战神引擎架设问题总结
  17. 阿拉伯数字改为汉字的大写
  18. LaTex 之 数学运算符号
  19. 王道书 P360 T03(计数排序)
  20. java 生成word表格

热门文章

  1. 人民日报80分申论范文:更好发挥文化的社会治理功能
  2. 数据库设计之area区域表
  3. 磊科路由器后门利用情况分析
  4. 线性代数_3、行列式的七大性质及推论
  5. 【基于Btrace的监控调试】
  6. 360潘剑锋:世界上存在没有漏洞的手机吗?
  7. java线程池下载图片,压缩图片大小
  8. 面试篇之HR问什么是静态代理?什么是动态代理?
  9. 论文阅读:A Semantic-based Method for Unsupervised Commonsense Question Answering
  10. 30+宝妈北漂4年,从行政成功转行软件测试,在地铁站外喜极而泣......