VS2017的redis客户端实现

VS2017下Redis服务器源码地址
https://download.csdn.net/download/qq_23350817/88541316

VS2017下Redis客户端源码地址(hiredis已完成windows下编译):
https://download.csdn.net/download/qq_23350817/88541242

C代码实现:

#include <stdio.h> 
#include <stdlib.h> 
#include <stddef.h> 
#include <stdarg.h> 
#include <string.h> 
#include <assert.h> 
#include <hiredis.h>

void doTest()
{
	//redis默认监听端口为6387 可以再配置文件中修改 
	redisContext* c = redisConnect("10.10.0.7", 6379);
	if (c->err)
	{
		redisFree(c);
		printf("Connect to redisServer faile\n");
		return;
	}

	// 进行身份验证(用户名和密码)
	redisReply *reply = (redisReply *)redisCommand(c, "AUTH test123");  // 替换为你的 Redis 密码

	if (reply == NULL || reply->type == REDIS_REPLY_ERROR) {
		printf("Authentication failed: %s\n", reply ? reply->str : "NULL");
		freeReplyObject(reply);
		return;
	}
	freeReplyObject(reply);

	reply = redisCommand(c, "SELECT 0");
	if (reply == NULL || reply->type == REDIS_REPLY_ERROR) {
		printf("Error selecting database: %s\n", reply ? reply->str : "NULL");
		freeReplyObject(reply);
		redisFree(c);
		return;
	}
	


	const char* command = "get auth:third-party:token";
	redisReply* r = (redisReply*)redisCommand(c, command);
	r = (redisReply*)redisCommand(c, command);
	if (r->type != REDIS_REPLY_STRING)
	{
		printf("Failed to execute command[%s]\n", command);
		freeReplyObject(r);
		redisFree(c);
		return;
	}
	printf("The value of 'sunx' is %s\n", r->str);
	freeReplyObject(r);
	printf("Succeed to execute command[%s]\n", command);

	redisFree(c);

}

int main()
{
	doTest();
	return 0;
}

#include <stdio.h> 
#include <stdlib.h> 
#include <stddef.h> 
#include <stdarg.h> 
#include <string.h> 
#include <assert.h> 
#include <hiredis.h> 

void doTest()
{
	//redis默认监听端口为6387 可以再配置文件中修改 
	redisContext* c = redisConnect("10.100.0.127", 6379);
	if (c->err)
	{
		redisFree(c);
		printf("Connect to redisServer faile\n");
		return;
	}
	printf("Connect to redisServer Success\n");

	const char* command1 = "set sunx 123456789";
	redisReply* r = (redisReply*)redisCommand(c, command1);

	if (NULL == r)
	{
		printf("Execut command1 failure\n");
		redisFree(c);
		return;
	}
	if (!(r->type == REDIS_REPLY_STATUS && strcmp(r->str, "OK") == 0))
	{
		printf("Failed to execute command[%s]\n", command1);
		freeReplyObject(r);
		redisFree(c);
		return;
	}
	freeReplyObject(r);
	printf("Succeed to execute command[%s]\n", command1);

	const char* command2 = "strlen sunx";
	r = (redisReply*)redisCommand(c, command2);
	if (r->type != REDIS_REPLY_INTEGER)
	{
		printf("Failed to execute command[%s]\n", command2);
		freeReplyObject(r);
		redisFree(c);
		return;
	}
	int length = r->integer;
	freeReplyObject(r);
	printf("The length of 'sunx' is %d.\n", length);
	printf("Succeed to execute command[%s]\n", command2);


	const char* command3 = "get sunx";
	r = (redisReply*)redisCommand(c, command3);
	if (r->type != REDIS_REPLY_STRING)
	{
		printf("Failed to execute command[%s]\n", command3);
		freeReplyObject(r);
		redisFree(c);
		return;
	}
	printf("The value of 'sunx' is %s\n", r->str);
	freeReplyObject(r);
	printf("Succeed to execute command[%s]\n", command3);

	const char* command4 = "get test";
	r = (redisReply*)redisCommand(c, command4);
	if (r->type != REDIS_REPLY_NIL)
	{
		printf("Failed to execute command[%s]\n", command4);
		freeReplyObject(r);
		redisFree(c);
		return;
	}
	printf("The value of 'test' is %s\n", r->str);
	freeReplyObject(r);
	printf("Succeed to execute command[%s]\n", command4);


	redisFree(c);

}

int main()
{
	doTest();
	return 0;
}

C++代码实现:

#include <iostream>
#include <string>
#include <winsock2.h>

extern "C" {
#include <hiredis.h>
}

#pragma comment(lib, "hiredis.lib")
#pragma comment(lib, "Win32_Interop.lib")

std::string GetToken()
{
	std::string strToken = "";
	std::string ipaddr = "10.100.0.127";
	int port = 6379;
	struct timeval timeout = { 5, 0 }; // 设置超时时间为 5 秒
	std::string password = "hlxredis";
	std::string setPasswdCmd = "AUTH " + password;
	std::string tokenKey = "auth:third-party:token";

	redisContext* c = redisConnectWithTimeout(ipaddr.c_str(), port, timeout);
	if (c->err)
	{
		redisFree(c);
		printf("Connect to redisServer faile\n");
		return strToken;
	}

	redisReply *reply = (redisReply *)redisCommand(c, setPasswdCmd.c_str());
	if (reply == NULL || reply->type == REDIS_REPLY_ERROR) {
		printf("Authentication failed: %s\n", reply ? reply->str : "NULL");
		freeReplyObject(reply);
		return strToken;
	}
	freeReplyObject(reply);

	std::string selectDbCmd = "SELECT 0";
	reply = (redisReply *)redisCommand(c, selectDbCmd.c_str());
	if (reply == NULL || reply->type == REDIS_REPLY_ERROR) {
		printf("Error selecting database: %s\n", reply ? reply->str : "NULL");
		freeReplyObject(reply);
		redisFree(c);
		return strToken;
	}
	
	std::string getTokenCmd = "get " + tokenKey;
	redisReply* r = (redisReply*)redisCommand(c, getTokenCmd.c_str());
	if (r->type != REDIS_REPLY_STRING)
	{
		printf("Failed to execute command[%s]\n", getTokenCmd.c_str());
		freeReplyObject(r);
		redisFree(c);
		return strToken;
	}
	strToken = r->str;
	printf("The value of 'sunx' is %s\n", r->str);
	freeReplyObject(r);
	printf("Succeed to execute command[%s]\n", getTokenCmd.c_str());

	redisFree(c);

	return strToken;
}

int main()
{
	std::cout << "token:" << GetToken() << std::endl;;
	return 0;
}

注意:C++代码实现时,VS2017可能会报错检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”,此时需要如下修改:
在这里插入图片描述

运行结果如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Maven教程】(十一):使用 Maven 构建 Web应用 —— 使用 jetty-maven-plugin 进行测试、使用 Cargo 实现自动化部署~

Maven 使用 Maven 构建 Web应用 1️⃣ Web 项目的目录结构2️⃣ account-service2.1 account-service的 POM2.2 account-service 的主代码 3️⃣ account-web3.1 account-web 的POM3.2 account-web 的主代码 4️⃣ 使用 jetty-maven-plugin 进行测试5️⃣ 使用 Cargo 实现自动…

【文件上传】01ctfer 文件上传获取flag

1.1漏洞描述 漏洞名称01ctfer 文件上传漏洞类型文件上传漏洞等级⭐⭐⭐漏洞环境docker攻击方式 1.2漏洞等级 高危 1.3影响版本 暂无 1.4漏洞复现 1.4.1.基础环境 靶场docker工具BurpSuite 1.4.2.环境搭建 1.创建docker-compose.yml文件 version: 3.2 services: upload: …

Banana Pi BPI-W3之RK3588安装Qt+opencv+采集摄像头画面.

场景&#xff1a;在Banana Pi BPI-W3 RK3588上做qt开发工作RK3588安装Qtopencv采集摄像头画面 2. 环境介绍 硬件环境&#xff1a; Banana Pi BPI-W3RK3588开发板、MIPI-CSI摄像头( ArmSoM官方配件 )软件版本&#xff1a; OS&#xff1a;ArmSoM-W3 Debian11 QT&#xff1a;QT5…

Compose学习之绘制速度表盘

内心想法XX compose已经发布好久了&#xff0c;还没有用过compose写过UI&#xff0c;之前只是在官网上了解过&#xff0c;看着这可组合函数嵌套&#xff0c;我就脑袋大&#xff0c;更Flutter一个德行&#xff0c;我的内心是抵触的&#xff0c;还是觉得用XML写香&#xff0c;抱…

广州华锐互动:办税服务厅税务登记VR仿真体验让税务办理更加灵活高效

在数字化世界的今天&#xff0c;我们正在见证各种业务过程的转型&#xff0c;而税务办理也不例外。最近&#xff0c;一种全新的交互方式正在改变我们处理税务的方式&#xff1a;虚拟现实&#xff08;VR&#xff09;。 首先&#xff0c;用户需要戴上虚拟现实头显&#xff0c;然后…

Antv/G2 柱状图添加自定义点击事件

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>柱状图点击事件</title></head><body><div id"container" /><script src"https://gw.alipayobjects.com/os/lib/antv/g2/4.2.8/…

每日一练 | 华为认证真题练习Day131

1、某台路由器输出信息如下&#xff0c;下列说法正确的有&#xff1f;&#xff08;多选&#xff09; A. 本路由器是DR B. 路由器Router ID为10.0.1.1 C. 路由器Router ID为10.0.2.2 D. 本路由器的接口地址为10.0.12.2 2、以下那条命令可以开启路由器接口的DHCP中继功能&…

TS7031: Binding element ‘role‘ implicitly has an ‘any‘ type.

文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 他们是天生勇敢的开发者&#xff0c;我们创造bug&#xff0c;传播bug&#xff0c;毫不留情地消灭bug&#xff0c;在这个过程中我们创造了很多bug以供娱乐。 前端bug这里是博主总结的一些前端的bug以及解决方案&#xff0c;感兴…

就近值 reduce用法 时间戳与时间点对比循环查找

后台接口返回的13为时间戳 需要与数据data的time做对比&#xff0c;查找出最近的值 data的数据结构如下&#xff1a; 将&#xff1a;改为空格&#xff0c;变成数字之间的对比 //查找最近的时间getNearestTime(timestamp, data) {let date new Date(timestamp)let h date.ge…

windows c++开发

一 安装 离线MSDN MSDN:microsoft developer network ,微软向开发人员提供的一套帮助系统。 运行vs 2017 -》运行 vs studio installer ->点击修改-》单个组件-》代码工具-》help viewer-> 安装完后&#xff0c;启动vs 在“帮助”菜单&#xff0c;“设置帮助首选项…

使用Kohya_ss训练Stable Diffusion Lora

Stable Diffusion模型微调方法 Stable Diffusion主要有 4 种方式&#xff1a;Dreambooth, LoRA, Textual Inversion, Hypernetworks。 Textual Inversion &#xff08;也称为 Embedding&#xff09;&#xff0c;它实际上并没有修改原始的 Diffusion 模型&#xff0c; 而是通过…

Sonar生成PDF错误Can‘t get Compute Engine task status.Retry..... HTTP error: 401

报错及修改&#xff1a; 报错&#xff1a;INFO: Can’t get Compute Engine task status.Retry… org.sonarqube.ws.connectors.ConnectionException: HTTP error: 401, msg: , query: org.apache.commons.httpclient.methods.GetMethod7a021f49 ERROR: Problem generating PD…

Python-pptx教程之二操作已有PPT模板文件

文章目录 简单的案例找到要修改的元素修改幻灯片中的文本代码使用示例 修改幻灯片的图片代码使用示例 删除幻灯片代码使用示例 获取PPT中所有的文本内容获取PPT中所有的图片总结 在上一篇中我们已经学会了如何从零开始生成PPT文件&#xff0c;从零开始生成较为复杂的PPT是非常消…

基于边缘智能网关的冬季管网智能监测应用

随着我国北方全面进入到冬季&#xff0c;多日以来严寒、降雪天气频发&#xff0c;民生基础设施也迎来冬季考验。尤其是民众生活仰赖的水、电、气管网&#xff0c;面临极端冰雪天气时易存在各种风险&#xff0c;包括管道水/气泄露损耗、低温冻裂、积雪压塌压损、冻结受阻等。 针…

前端常用的几种加密方法

文章目录 前端常用的几种加密方法md5 加密(不可逆)base64 位加密(可加密可解密)RSA 加密(公钥加密&#xff0c;私钥解密)AES 加密(需要密钥才能解密)CryptoJS 常用的加密方式--demo ✒️总结 前端常用的几种加密方法 在信息安全越来越受重视的今天&#xff0c;JS 安全一直是前端…

无需API实现MySQL与巨量引擎的对接

通过数环通&#xff0c;您可以使用不到几分钟的时间即可实现MySQL与巨量引擎的对接与集成&#xff0c;从而高效实现工作流程自动化&#xff0c;降本增效&#xff01; 1.产品介绍 巨量引擎是字节跳动旗下的营销服务品牌&#xff0c;它整合了字节跳动旗下的产品及海量内容&#…

asp.net购物网站源码-系统销售毕业设计

采用典型的三层架构进行开发&#xff0c;包含购物车、登陆注册、个人中心、留言板、新闻系统&#xff0c;前台页面、后台管理等主要技术&#xff1a;基于asp.net架构和sql server数据库 功能模块&#xff1a; 本源码是一个三层购物网站源码&#xff0c;功能齐全&#xff0c;界面…

【PyQt小知识 - 4】:QGroupBox分组框控件 - 边框和标题设置

QGroupBox QGroupBox 是 PyQt 中的一个小部件&#xff0c;用于创建一个带有标题的组框。 可以使用 QGroupBox 将相关控件分组并添加一个标题。 以下是一个使用 QGroupBox 的示例代码&#xff08;示例一&#xff09;&#xff1a; from PyQt5.QtWidgets import * import sysa…

Linux_虚拟机常用目录汇总

根目录&#xff08;cd /&#xff09;&#xff1a;/ 表示根目录&#xff0c;cd和 / 之间有个空格&#xff01; 用户目录&#xff08;cd ~&#xff09;&#xff1a;~ 表示用户目录&#xff0c;也称为家目录。cd 和 ~ 之间有个空格&#xff01; 当前路径&#xff1a;执行 pwd 指令…

linux运行java程序

这个帖子实现的是linux上运行java代码 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 事情发生的原因是博洋需要知道海外城市的数量&#xff0c;我一开始准备将全量数据拉取到本地&#xff0c;用代码遍历一遍。但是打包好全量数据&…