3. Windows下C++/MFC调用hiredis库操作redis示例
一、头文件目录
将之前下载和编译好的Redis目录拷贝到新建好的工程目录下面,再点击测试工程的右键/属性,点击C++/常规,附加包含目录添加以下路径,注意如果原先有多个路径,在末尾处添加分号后再粘贴:
点击C++/常规,附加包含目录
redis-3.0;redis-3.0/src;redis-3.0/deps/hiredis;redis-3.0/deps/linenoise;redis-3.0/deps/lua/src;redis-3.0/src/Win32_Interop;
点击完成即可
二、引入头文件和LIB文件
参照下面的,在你测试工程中加入以下代码:
#include <hiredis.h>
#pragma comment(lib, "ws2_32.lib")#ifdef _DEBUG
#pragma comment(lib, "redis-3.0/msvs/Win32/Debug/hiredis.lib")
#pragma comment(lib, "redis-3.0/msvs/Win32/Debug/Win32_Interop.lib")
#else
#pragma comment(lib, "redis-3.0/msvs/Win32/Release/hiredis.lib")
#pragma comment(lib, "redis-3.0/msvs/Win32/Release/Win32_Interop.lib")
#endif
三、连接测试
公共结构体类:
int m_nId; // 当前编号
redisContext *m_pRedis; // 当前redis服务器指针
ULONGLONG m_nHeart; // 最后心跳时间
ULONGLONG m_nPingSec; // 检测时间间隔(秒)
char m_szHost[MAX_PATH]; // redis服务器IP
int m_nPort; // redis端口
char m_szPass[MAX_PATH]; // redis密码
UINT m_nAuth; // 网关密码
1、联机、断开
// 释放redis
void redis_disconnect()
{if (NULL == m_pRedis)return;redisFree(m_pRedis);m_pRedis = NULL;redis_AddLog(/*(%d)已经断开redis数据库.*/XorStr<0x59, 25, 0x1C94563E>("\x71\x7F\x3F\x75\x8F\x8F\xE1\xCD\xD7\xAD\xDC\xCE\x17\x03\x03\x01\x1A\xA0\x96\xD2\xB0\xD1\x8D\x5E" + 0x1C94563E).s, m_nId);
}// 连接redis
BOOL redis_connect()
{redisReply *reply = NULL;struct timeval timeout = { 3, 500000 };redis_disconnect();m_pRedis = redisConnectWithTimeout(m_szHost, m_nPort, timeout);if (m_pRedis->err){redis_AddLog(/*[%s:%d] 连接redis服务器(%d)失败,错误代码: %s*/XorStr<0xC1, 46, 0x955F63A2>("\x9A\xE7\xB0\xFE\xE0\xA2\x9A\xE8\x08\x66\x76\x1F\xBF\xAB\xAB\xB9\xA2\x65\x2D\x1A\x24\x10\x20\xF0\xFC\xBE\xF2\x16\x7A\x6E\x03\x43\x4D\x56\x0E\x2A\x16\x52\x1D\x2A\x02\xD0\xCB\xC9\x9E" + 0x955F63A2).s, m_szHost, m_nPort, m_nId, m_pRedis->errstr);redisFree(m_pRedis);m_pRedis = NULL;return FALSE;}redis_AddLog(/*[OK] 连接redis服务器(%d)成功 %s:%d*/XorStr<0xAE, 35, 0x232B52CE>("\xF5\xE0\xFB\xEC\x92\x72\x18\x08\x65\xC5\xDD\xDD\xD3\xC8\x0B\x43\x70\x4E\x06\x36\xEA\xE6\xA0\xEC\x75\x0E\x71\x6F\xEA\xEE\xBF\xF7\xEB\xAB" + 0x232B52CE).s, m_nId, m_szHost, m_nPort);reply = (redisReply *)redisCommand(m_pRedis, /*AUTH %s*/XorStr<0x72, 8, 0x6E375481>("\x33\x26\x20\x3D\x56\x52\x0B" + 0x6E375481).s, m_szPass);if (NULL == reply){redis_AddLog(/*[%s] 认证redis服务器(%d)失败,错误代码: %s*/XorStr<0x9E, 43, 0xCE5856B8>("\xC5\xBA\xD3\xFC\x82\x6B\x6B\x73\x02\xD5\xCD\xCD\xC3\xD8\x1B\x53\x60\x5E\x76\x46\x9A\x96\xD0\x9C\x7C\x10\x08\x65\x19\x17\x08\x50\x70\x4C\x74\x3B\x00\x28\xFE\xE5\xE3\xB4" + 0xCE5856B8).s, m_szPass, m_nId, m_pRedis->errstr);return FALSE;}freeReplyObject(reply);reply = NULL;redis_AddLog(/*[OK] 认证redis服务器成功 (%d)*/XorStr<0xF0, 30, 0xE12E1955>("\xAB\xBE\xB9\xAE\xD4\x3D\x39\x21\x5C\x8B\x9F\x9F\x95\x8E\x49\x01\xCE\xF0\xC4\xF4\xB7\xCC\xBF\xA1\x28\x21\x2F\x6F\x25" + 0xE12E1955).s, m_nId);return TRUE;
}
2、选择数据库
// 选择数据库
BOOL redis_selectDB(const UINT uDB)
{redisReply *reply = NULL;reply = (redisReply *)redisCommand(m_pRedis, /*SELECT %u*/XorStr<0xF2, 10, 0xC3F71964>("\xA1\xB6\xB8\xB0\xB5\xA3\xD8\xDC\x8F" + 0xC3F71964).s, uDB);if (NULL == reply){redis_AddLog(/*[%u] 选择redis服务器(%d)失败,错误代码: %s*/XorStr<0x9A, 43, 0x24B46B42>("\xC1\xBE\xE9\xC0\xBE\x4E\x01\x75\x53\xD1\xC1\xC1\xCF\xD4\x1F\x57\x64\x5A\x6A\x5A\x86\x8A\xD4\x98\x78\x14\x04\x69\x15\x1B\x0C\x54\x74\x48\x08\x47\x7C\x54\xFA\xE1\xE7\xB0" + 0x24B46B42).s, uDB, m_nId, m_pRedis->errstr);return FALSE;}if (REDIS_REPLY_ERROR == reply->type){redis_AddLog(/*[%u-%d] 选择redis服务器(%d)失败,错误代码: %s*/XorStr<0x3B, 46, 0x88E824CB>("\x60\x19\x48\x13\x1A\x24\x1C\x62\x92\xE5\x91\xB7\x35\x2D\x2D\x23\x38\xFB\xB3\x80\xBE\x96\xA6\x7A\x76\x30\x7C\x9C\xF0\xE8\x85\xF9\xF7\xE8\xB0\x90\xAC\xD4\x9B\xA0\x88\x5E\x45\x43\x14" + 0x88E824CB).s, uDB, reply->type, m_nId, m_pRedis->errstr);return FALSE;}freeReplyObject(reply);reply = NULL;return TRUE;
}
3、ping
// 根据服务器类型来连接相应的redis服务器
BOOL redis_ping()
{redisReply *reply = NULL;if (NULL == m_pRedis)return FALSE;reply = (redisReply *)redisCommand(m_pRedis, /*PING*/XorStr<0x75, 5, 0x8A439BB6>("\x25\x3F\x39\x3F" + 0x8A439BB6).s);if (NULL == reply){redis_AddLog(/*[%u] ping redis服务器失败,错误代码: %s*/XorStr<0xF1, 40, 0xD0EF1314>("\xAA\xD7\x86\xA9\xD5\x86\x9E\x96\x9E\xDA\x89\x99\x99\x97\x8C\xB7\xFF\xCC\xF2\xC2\xF2\xCC\xA0\xB8\xD5\xA9\xA7\xB8\xE0\xC0\xFC\xA4\xEB\xD0\xF8\x2E\x35\x33\x64" + 0xD0EF1314).s, m_nId, m_pRedis->errstr);return FALSE;}if (REDIS_REPLY_ERROR == reply->type){redis_AddLog(/*[%u-%d] ping redis服务器失败,错误代码: %s*/XorStr<0xF8, 43, 0x0658E001>("\xA3\xDC\x8F\xD6\xD9\x99\xA3\xDF\x70\x68\x6C\x64\x24\x77\x63\x63\x61\x7A\xBD\xF5\xC2\xFC\xC8\xF8\xDA\xB6\xA2\xCF\xB7\xB9\xA2\xFA\xD6\xEA\xAE\xE1\xDE\xF6\x24\x3F\x05\x52" + 0x0658E001).s, m_nId, reply->type, m_pRedis->errstr);return FALSE;}freeReplyObject(reply);reply = NULL;return TRUE;
}
4、检查心跳保持TCP长链接
// 检查心跳时间
void redis_checkHeart()
{if ((MyGetTickCount() - m_nHeart) <= (m_nPingSec * 1000))return;if (redis_ping()){redis_update();}else{redis_AddLog(/*(%d) redis服务器已连接失败,正在重试...*/XorStr<0xE7, 39, 0x0721955D>("\xCF\xCD\x8D\xC3\xCB\x9E\x88\x8A\x86\x83\x46\x0C\x3D\x05\x33\x01\x25\x29\x38\x56\x46\x2F\x37\x59\x4F\xDC\x2D\xD7\xFE\xD0\xDF\xD0\xDF\xC2\xDD\x24\x25\x22" + 0x0721955D).s, m_nId);if (redis_connect()){redis_AddLog(/*(%d) redis服务器重连接成功...*/XorStr<0x4A, 30, 0xA65E412B>("\x62\x6E\x28\x64\x6E\x3D\x35\x35\x3B\x20\xE3\xAB\x98\xA6\x9E\xAE\x8C\x83\x9D\xF1\xE3\x8C\xD3\xA8\xDB\xC5\x4A\x4B\x48" + 0xA65E412B).s, m_nId);redis_update();}}
}
5、重连机制
// 检查服务器是否连接,否则重连一次
BOOL redis_checkOnlineReconnect()
{if (!redis_ping()){redis_disconnect();if (!redis_connect()){redis_AddLog(/*(%d) redis服务器重连接失败,请检查redis是否在线...*/XorStr<0xA0, 50, 0xD2F7074C>("\x88\x84\xC6\x8A\x84\xD7\xC3\xC3\xC1\xDA\x1D\x55\x62\x5C\x68\x58\x66\x69\x73\x1F\x09\x66\x7C\x10\x08\x65\x96\x7C\x57\x01\x52\x0D\x29\xB3\xA7\xA7\xAD\xB6\x0C\x00\x7F\x38\x1E\x11\x03\x12\xE0\xE1\xFE" + 0xD2F7074C).s, m_nId);return FALSE;}if (!redis_ping()){redis_AddLog(/*(%d) redis服务器重连接成功,但ping失败,请检查redis是否在线...*/XorStr<0x51, 62, 0x3B40D26D>("\x79\x77\x37\x7D\x75\x24\x32\x3C\x30\x29\xEC\xA2\x93\xAF\x99\x97\xB7\xBA\xA2\xC8\xD8\xB5\xD4\xA1\xD0\xCC\x47\xD9\xC6\x1E\x06\x1E\x16\xB8\xD4\xC4\xA9\xD5\xDB\xBF\x92\xC6\x97\xCE\x94\x0C\x1A\xE4\xE8\xF1\x49\x43\x32\x77\x53\x52\x46\x55\xA5\xA2\xA3" + 0x3B40D26D).s, m_nId);return FALSE;}}redis_update();return TRUE;
}
6、注意避坑GetTickCount
这个函数有个致命BUG:已用时间存储为 DWORD 值。 因此,如果系统连续运行 49.7 天,则时间将环绕到零。 若要避免此问题,请使用 GetTickCount64 函数。 否则,在比较时间时,检查溢出条件。
下面是给出的解决办法 :
ULONGLONG MyGetTickCount()
{ULONGLONG ret = 0;#ifdef _WIN32ret = GetTickCount64();
#elsestruct timespec ts;clock_gettime(CLOCK_MONOTONIC, &ts);ret = (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
#endifreturn ret;
}
相关文章:

3. Windows下C++/MFC调用hiredis库操作redis示例
一、头文件目录 将之前下载和编译好的Redis目录拷贝到新建好的工程目录下面,再点击测试工程的右键/属性,点击C/常规,附加包含目录添加以下路径,注意如果原先有多个路径,在末尾处添加分号后再粘贴: 点击C/常…...

200、使用默认 Exchange 实现 P2P 消息 之 消息生产者(发送消息) 和 消息消费者(消费消息)
RabbitMQ 工作机制图: Connection: 代表客户端(包括消息生产者和消费者)与RabbitMQ之间的连接。 Channel: 连接内部的Channel。channel:通道 Exchange: 充当消息交换机的组件。 Queueÿ…...
SqlServer--get 和 post 请求 http接口
1. 开启 不开启报错 如下 4.1 SQL Server blocked access to procedure ‘sys.sp_OACreate’ sp_configure show advanced options, 1;GORECONFIGURE;GOsp_configure Ole Automation Procedures, 1;GORECONFIGURE;GO2. post Declare ServiceUrl nvarchar(MAX) Declare req_…...

利用人工智能提升企业培训的个性化体验
随着科技的不断进步,人工智能(AI)正逐渐渗透到各个领域。而在企业培训领域,人工智能也展现出了巨大的潜力。利用人工智能技术的企业培训系统,企业可以为员工提供个性化、高效的培训体验,进一步提升他们的专…...

基于JavaWeb的图书售卖网站(源码+部署+LW)
项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于JavaWeb的图书售卖网…...
Java设计模式之代理模式
代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对另一个对象的访问。代理模式在软件开发中经常被使用,它可以提供额外的功能,例如远程访问、延迟加载、访问控制和日志记录等。 代理模式涉及三个主要角色: 抽象…...
Oracle数据泵导入和导出命令
–管理员方式登录,新建表空间和用户,并建立文件夹映射路径并授权 CREATE DIRECTORY directory_name AS ‘path_to_directory’; grant read,write on directory directory to backup ** —EXPDP多线程备份数据库脚本–dblink–可以修改为命令行 echo …...
Linux中所有环境变量配置文件及用途
在Linux系统中,有多个文件可以用来配置环境变量,这些文件位于不同的目录和层级,并可以用于不同的目的。以下是一些常见的环境变量配置文件: 系统级环境变量文件: /etc/environment:这个文件包含了系统范围的…...

一文读懂flutter线程: 深入了解Flutter中的多线程编程
深入了解Flutter中的多线程编程 前言一、为什么需要多线程?二、在Flutter中创建线程三、多线程的最佳实践四、Flutter中的多线程示例五、Flutter中的多线程错误处理六、Flutter中的多线程性能优化七、安全性和隐私考虑八、跨平台性考虑 总结 前言 在移动应用开发领域…...

如何限制word文件中部分内容无法编辑
工作中我们经常会用到Word制作一些文件,文件中有一部分内容不想他人编辑,我们可以设置限制编辑,可以对一部分内容设置限制编辑,具体方法如下: 我们将需要将可以编辑的地方选中,然后打开限制编辑功能 然后勾…...

免疫球蛋白介绍
免疫球蛋白(Immunoglobulin,Ig)是广泛存在于哺乳动物血清、淋巴液、组织液和外分泌液中的一种具有抗体活性或化学结构与抗体相似的球蛋白,在机体防御疾病的重要成分在疾病研究、药物研发、疫苗评价中具有重要作用。抗体࿰…...

VMWare 安装CentOS7镜像
安装CentOS 7 整个安装过程分两大步,第一步装机器,第二步装系统. 第一步: 装机器 检查物理机虚拟化支持是否开启,需要进入到BIOS中设置,因各种电脑型号进入BIOS 方式不同,同学们自行查找对应品牌电脑如何进入BIOS 建…...

什么台灯最好学生晚上用?开学适合孩子学习的台灯
作为学龄期儿童的家长,最担心的就是孩子长时间学习影响视力健康。无论是上网课、写作业、玩桌游还是陪伴孩子读绘本,都需要一个足够明亮的照明环境,因此选购一款为孩子视力发展保驾护航的台灯非常重要。推荐五款适合孩子学习的台灯。 1. 书客…...
6.1 C/C++ 封装字符串操作
C/C语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。…...

小白网络安全学习手册
作为一个合格的网络安全工程师,应该做到攻守兼备,毕竟知己知彼,才能百战百胜。 谈起黑客,可能各位都会想到:盗号,其实不尽然;黑客是一群喜爱研究技术的群体,在黑客圈中,一…...

思科拟推出PuzzleFS驱动,采用Rust语言开发
据了解,PuzzleFS宣称是“下一代 Linux 容器文件系统”,并使用Rust语言编写,具有“快速镜像构建”、“直接挂载支持”、“内存安全保证”等功能mroeoyw。 Multiable万达宝制造ERP(www.multiable.com.cn/solutions_zz)支持自定义栏位,并智能制…...

为什么要学习python
Python 越来越火爆 Python 在诞生之初,因为其功能不好,运转功率低,不支持多核,根本没有并发性可言,在计算功能不那么好的年代,一直没有火爆起来,甚至很多人根本不知道有这门语言。 随着时代的…...

相机噪声评估
当拥有一个相机,并且写了一个降噪的算法,想要测试降噪的应用效果。 相机在光线不足的情况下产生噪点的原因主要与以下几个因素有关: 感光元件的工作原理:相机的图像传感器是由数百万甚至数千万的感光元件(如CMOS或CC…...

CRM系统:快速实现外勤出差人员远程访问企业提升工作效率!
🎬 鸽芷咕:个人主页 🔥 个人专栏:《速学数据结构》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 快速实现外勤出差人员远程访问企业CRM系统前言1. 无需公网IP,高效低成本实现CRM系统远程访问1.1 下…...

028.Python面向对象_类补充_元类
我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...