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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/158028.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派玩转openwrt软路由:11.OpenWrt安装NodeRed

1、更新软件源 opkg update2、安装nodered docker run -it -p 1880:1880 --name mynodered nodered/node-red3、安装完整性测试 实现一个打印hello world的demo&#xff0c;每隔1秒打印一次

css 星星闪烁加载框

今天带来的是普灵普灵的loader闪烁加载框 效果如下 开源精神给我们带来了源码 ,源码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, in…

Spring framework Day10:JSR330注入注解

前言 JSR330是Java社区标准化进程&#xff08;Java Community Process&#xff0c;简称JCP&#xff09;中的一个规范&#xff0c;全名为"Dependency Injection for Java"&#xff0c;即Java的依赖注入规范。它定义了一组注解和相关的规范&#xff0c;用于实现依赖注…

python每日一练(7)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

Visual Studio 错误CS0006:未能找到元数据文件踩坑记录

前言 在写项目的时候&#xff0c;添加了个新的Nuget包&#xff0c;突然就不行&#xff0c;然后就是报错&#xff0c;找不到文件、 出现的原因是因为项目之间互相引用出现了问题&#xff0c;比如如下情况 先版本回退 如果有Git仓库 第一时间去看Git 文件比较&#xff0c;找到…

YOLOv5算法改进(11)— 主干网络介绍(MobileNetV3、ShuffleNetV2和GhostNet)

前言:Hello大家好,我是小哥谈。主干网络通常指的是深度学习中的主干模型,通常由多个卷积层和池化层组成,用于提取输入数据的特征。在训练过程中,主干网络的参数会被不断优化以提高模型的准确性。YOLOv5算法中的主干网络可以有多种替换方案,为了后面讲解的方便,本篇文章就…

自动驾驶学习笔记(三)——场景设计

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《2023星火培训【感知专项营】》免费课程—>传送门 文章目录 前言 场景设计平台 场景地图 场景基本…

【NLTK系列01】:nltk库介绍

一、说明 NLTK是个啥&#xff1f;它是个复杂的应用库&#xff0c;可以实现基本预料库操作&#xff0c;比如&#xff0c;、将文章分词成独立token&#xff0c;等操作。从词统计、标记化、词干提取、词性标记&#xff0c;停用词收集&#xff0c;包括语义索引和依赖关系解析等。 …

Android---java线程优化 偏向锁、轻量级锁和重量级锁

java 中的线程是映射到操作系统原生线程之上的&#xff0c;如果要阻塞或唤醒一个线程就需要操作系统的帮忙&#xff0c;这就需要从用户态转换到核心态。状态转换需要花费很多时间&#xff0c;如下代码所示&#xff1a; private Object lock new Object();private int value;p…

异星工场入门笔记-01

两年前玩过一点&#xff0c;不看教程&#xff0c;单纯地开放世界自己探索&#xff0c;没有同类游戏经验&#xff0c;因此很难有获得感所以放弃了。现在正版游戏涨到130&#xff0c;看在逆势上涨的份上&#xff0c;我倒想继续探索下这个游戏的价值。 玩魔方&#xff0c;记教程步…

Kubernetes使用OkHttp客户端进行网络负载均衡

在一次内部Java服务审计中&#xff0c;我们发现一些请求没有在Kubernetes&#xff08;K8s&#xff09;网络上正确地实现负载均衡。导致我们深入研究的问题是HTTP 5xx错误率的急剧上升&#xff0c;由于CPU使用率非常高&#xff0c;垃圾收集事件的数量很多以及超时&#xff0c;但…

【UE 插件】UE4 虚幻引擎 插件开发(带源码插件打包、无源码插件打包) 有这一篇文章就够了!!!

目录 0 引言1 快速入门1.1 新建插件的前提1.2 创建插件步骤1.3 打包插件 2 无源代码的插件制作3 插件详细介绍3.1 插件的使用方法3.1 UE 预置插件模版3.1.1 空白3.1.2 纯内容3.1.3 编辑器独立窗口3.1.4 编辑器工具栏按钮3.1.5 编辑器模式3.1.6 第三方库3.1.7 蓝图库 3.2 插件中…

华为OD机试 - 最大括号深度 - 栈stack(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。 刷的越多,

本、硕、博区别真的辣么大吗?

61&#xff1a; 发际线已经说明了一切…… Super Mario&#xff1a; 小学&#xff0c;老师告诉学生&#xff1a;“森林里有只老虎&#xff0c;已经被我关在笼子里&#xff0c;我会带你去那个地方&#xff0c;然后给你一把猎枪&#xff0c;告诉你猎枪怎么用&#xff0c;并开枪…

搭建一个vscode+uni+vue的小程序项目

我们使用 vue2 创建工程作为示例&#xff0c;uni-app中Vue2版的组件库和插件也比较多&#xff0c;稳定、问题少&#xff0c;可以先参考下官方文档:uni-app官网 既然是使用vue脚手架&#xff0c;那肯定要全局安装vue/cli&#xff0c;已安装的可以跳过。 注意&#xff1a;Vue2创…

day05-前后端项目上传到gitee、后端多方式登录接口、发送短信功能、发送短信封装、短信验证码接口、短信登录接口

1 前后端项目上传到gitee 2 后端多方式登录接口 2.1 序列化类 2.2 视图类 2.3 路由 3 发送短信功能 4 发送短信封装 4.0 目录结构 4.1 settings.py 4.2 sms.py 5 短信验证码接口 6 短信登录接口 6.1 视图类 6.2 序列化类 1 前后端项目上传到gitee # 我们看到好多开源项目…

解决react使用css module无法重写bootstrap样式的问题

react使用css module虽然能够解决样式污染&#xff0c;但是同时也失去了写css样式的灵活性&#xff0c;特别是&#xff1a;在.module.css文件中当子元素是非变量的静态class类&#xff08;比如bootstrap&#xff09;, 此时使用css选择器对该子元素的样式不会起作用的 比如下面…

boot分页

List<ElectricDispatchTodoPO> todoList electricDispatchTodoService.queryTodlList(vo, sysStaffVO);// 计算总记录数int total todoList.size();// 如果总记录数大于0PageInfo<ElectricDispatchTodoPO> pageInfo new PageInfo<>();if (total > 0) {…

聚观早报 | “百度世界2023”即将举办;2024款岚图梦想家上市

【聚观365】10月13日消息 “百度世界2023”即将举办 2024款岚图梦想家上市 腾势D9用户超10万 华为发布新一代GigaGreen Radio OpenAI拟进行重大更新 “百度世界2023”即将举办 “百度世界2023”将于10月17日在北京首钢园举办。届时&#xff0c;百度创始人、董事长兼首席执…

科技资讯|9月新能源汽车零售74.3万辆,充电桩迎来发展高峰

据中国乘联会发布的初步数据&#xff0c;中国 9 月份乘用车市场零售 202.8 万辆&#xff0c;同比增长 6%&#xff0c;环比增 6%。今年以来&#xff0c;我国乘用车市场累计零售 1,524 万辆&#xff0c;同比增长 2%。 乘联会预计&#xff0c;9 月份新能源车市场零售 74.3 万辆&a…