当前位置: 首页 > news >正文

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目录拷贝到新建好的工程目录下面&#xff0c;再点击测试工程的右键/属性&#xff0c;点击C/常规&#xff0c;附加包含目录添加以下路径&#xff0c;注意如果原先有多个路径&#xff0c;在末尾处添加分号后再粘贴&#xff1a; 点击C/常…...

200、使用默认 Exchange 实现 P2P 消息 之 消息生产者(发送消息) 和 消息消费者(消费消息)

RabbitMQ 工作机制图&#xff1a; Connection&#xff1a; 代表客户端&#xff08;包括消息生产者和消费者&#xff09;与RabbitMQ之间的连接。 Channel&#xff1a; 连接内部的Channel。channel&#xff1a;通道 Exchange&#xff1a; 充当消息交换机的组件。 Queue&#xff…...

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_…...

利用人工智能提升企业培训的个性化体验

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

基于JavaWeb的图书售卖网站(源码+部署+LW)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于JavaWeb的图书售卖网…...

Java设计模式之代理模式

代理模式是一种结构型设计模式&#xff0c;它允许通过创建一个代理对象来控制对另一个对象的访问。代理模式在软件开发中经常被使用&#xff0c;它可以提供额外的功能&#xff0c;例如远程访问、延迟加载、访问控制和日志记录等。 代理模式涉及三个主要角色&#xff1a; 抽象…...

Oracle数据泵导入和导出命令

–管理员方式登录&#xff0c;新建表空间和用户&#xff0c;并建立文件夹映射路径并授权 CREATE DIRECTORY directory_name AS ‘path_to_directory’; grant read,write on directory directory to backup ** —EXPDP多线程备份数据库脚本–dblink–可以修改为命令行 echo …...

Linux中所有环境变量配置文件及用途

在Linux系统中&#xff0c;有多个文件可以用来配置环境变量&#xff0c;这些文件位于不同的目录和层级&#xff0c;并可以用于不同的目的。以下是一些常见的环境变量配置文件&#xff1a; 系统级环境变量文件&#xff1a; /etc/environment&#xff1a;这个文件包含了系统范围的…...

一文读懂flutter线程: 深入了解Flutter中的多线程编程

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

如何限制word文件中部分内容无法编辑

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

免疫球蛋白介绍

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

VMWare 安装CentOS7镜像

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

什么台灯最好学生晚上用?开学适合孩子学习的台灯

作为学龄期儿童的家长&#xff0c;最担心的就是孩子长时间学习影响视力健康。无论是上网课、写作业、玩桌游还是陪伴孩子读绘本&#xff0c;都需要一个足够明亮的照明环境&#xff0c;因此选购一款为孩子视力发展保驾护航的台灯非常重要。推荐五款适合孩子学习的台灯。 1. 书客…...

6.1 C/C++ 封装字符串操作

C/C语言是一种通用的编程语言&#xff0c;具有高效、灵活和可移植等特点。C语言主要用于系统编程&#xff0c;如操作系统、编译器、数据库等&#xff1b;C语言是C语言的扩展&#xff0c;增加了面向对象编程的特性&#xff0c;适用于大型软件系统、图形用户界面、嵌入式系统等。…...

小白网络安全学习手册

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

思科拟推出PuzzleFS驱动,采用Rust语言开发

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

为什么要学习python

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

相机噪声评估

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

CRM系统:快速实现外勤出差人员远程访问企业提升工作效率!

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

028.Python面向对象_类补充_元类

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…...

手把手教你用示波器抓取Intel CPU的SVID时序(附读写判定与Intel送测指南)

实战指南&#xff1a;利用示波器精准解析Intel CPU的SVID通信时序 当一块新设计的服务器主板首次上电时&#xff0c;电源管理系统的稳定性往往决定了整个平台的可靠性。作为硬件工程师&#xff0c;我们常常需要直面这样的场景&#xff1a;主板虽然能点亮&#xff0c;但CPU与电压…...

飞秒激光微纳加工:原理、系统选型与典型应用实践

1. 飞秒激光加工&#xff1a;微纳世界的“手术刀”在精密制造领域&#xff0c;尤其是半导体、生物医疗和光子芯片这些前沿行业&#xff0c;对加工精度的要求已经到了纳米甚至亚纳米级别。传统的机械加工、长脉冲激光加工&#xff0c;在面对这种“微雕”任务时&#xff0c;往往显…...

Agentic RAG的实现方式?

文档智能体开发正迎来“低门槛时代”。基于PaddleOCR与LangChain社区的集成合作&#xff0c;文心飞桨开发者进一步搭建了可视化管理工具ClawMaster——让开发者无需从零部署模型或编写复杂调用逻辑&#xff0c;10分钟即可跑通文档智能体工作流。与此同时&#xff0c;X-AnyLabel…...

告别卡顿!用华为云ECS搭建eNSP Pro大型网络实验的保姆级避坑指南

华为云ECS部署eNSP Pro全流程性能优化实战 当你在本地PC上尝试运行包含20台NE路由器的复杂拓扑时&#xff0c;风扇狂转的噪音和逐渐卡死的界面是否让你抓狂&#xff1f;作为一位曾经被32GB内存工作站折磨过的网络工程师&#xff0c;我完全理解这种痛苦。直到发现华为云ECS这个&…...

别再从头训练了!用SAM-Adapter‘轻量化’微调,让你的分割模型快速适配新任务

SAM-Adapter&#xff1a;轻量化微调技术让图像分割模型快速适配新任务 在计算机视觉领域&#xff0c;Segment Anything Model&#xff08;SAM&#xff09;的出现无疑掀起了一场分割技术的革命。这个由Meta推出的基础模型&#xff0c;以其惊人的零样本泛化能力震撼了整个行业。然…...

Faster-Whisper + WebSocket实战:给你的Unity游戏或应用加上实时语音交互

Faster-Whisper WebSocket全链路实战&#xff1a;构建Unity实时语音交互系统 在游戏和交互式应用开发中&#xff0c;语音交互正成为提升用户体验的关键功能。想象一下玩家通过语音指令控制角色、VR环境中自然对话交互&#xff0c;或是教育软件中实时语音反馈的场景——这些都需…...

广州初创公司,办公家具租还是买?我帮你算了一笔账

广州很多初创公司都会面临一个真实问题&#xff1a;现金流紧张、抗风险能力弱&#xff0c;办公家具采购却是一笔不小的开支。租划算&#xff0c;还是买划算&#xff1f;结合广州初创公司的经营特点和现金流需求&#xff0c;我从成本、灵活性、风险、售后四个维度对比后得出的结…...

为什么你的/fast命令总被降级?Midjourney内部队列优先级算法首度曝光(含3个即时生效的Prompt签名技巧)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;快速模式降级现象的本质解构 快速模式降级&#xff08;Fast Mode Degradation&#xff09;并非简单的性能衰减&#xff0c;而是现代异步I/O栈中多层协同机制在资源约束下触发的确定性状态迁移过程。其本质是内…...

CAD新手别再用直线硬画了!用PL命令的‘A’和‘R’快速搞定带半径的圆弧多段线

CAD高效绘图&#xff1a;用PL命令玩转带半径的圆弧多段线 刚接触CAD的设计师常陷入一个误区——用直线工具硬生生拼接出复杂曲线。这种操作不仅效率低下&#xff0c;后期修改更是噩梦。想象一下绘制建筑装饰线条或机械管道弯头时&#xff0c;反复调整几十个线段连接点的场景。其…...

如何在VSCode中实现高效Mermaid图表实时预览:一站式解决方案

如何在VSCode中实现高效Mermaid图表实时预览&#xff1a;一站式解决方案 【免费下载链接】vscode-mermaid-preview Previews Mermaid diagrams 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-mermaid-preview 还在为技术文档中的图表制作而头疼吗&#xff1f;你是…...