VS2017的redis客户端实现

news2024/11/27 2:19:30

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”,此时需要如下修改:
在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

053-第三代软件开发-元对象系统

第三代软件开发-元对象系统 文章目录 第三代软件开发-元对象系统项目介绍元对象系统Qt的元对象系统如何实现对象的属性系统&#xff1f;请问Qt的元对象系统还有哪些功能&#xff1f;Qt的元对象系统支持哪些类型的事件&#xff1f;元对象系统中的属性可以用于实现哪些功能&#…

安卓调用onnx模型并计算

安卓平台可以通过调用onnx模型来进行计算&#xff0c;这为移动设备提供了更多的计算能力和应用场景。通过使用onnx模型&#xff0c;安卓设备可以进行复杂的计算任务&#xff0c;例如图像识别、语音识别等。这为移动应用的功能和性能提升提供了新的可能性。同时&#xff0c;开发…

【深度学习】吴恩达课程笔记(五)——超参数调试、batch norm、Softmax 回归

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【吴恩达课程笔记专栏】 【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础 【深度学习】吴恩达课程笔记(二)——浅层神经网络、深层神经网络 【深度学习】吴恩达课程笔记(三)——参数VS超参数、深度…

AI技术如何融合应用于工业物联网

人工智能技术在近年来得到飞跃性地发展&#xff0c;在自主识别、分析、判断、规划等功能方面都进步显著&#xff0c;也已经应用于越来越多的行业产业。 在工业物联网领域&#xff0c;人工智能也将成为一大助力&#xff0c;通过与工业物联网系统集成融合&#xff0c;能够为工业…

探索arkui(2)--- 布局(列表)--- 1(列表数据的展示)

前端开发布局是指前端开发人员宣布他们开发的新网站或应用程序正式上线的活动。在前端开发布局中&#xff0c;开发人员通常会展示新网站或应用程序的设计、功能和用户体验&#xff0c;并向公众宣传新产品的特点和优势。前端开发布局通常是前端开发领域的重要事件&#xff0c;吸…

JS-项目实战-批量删除水果库存记录

1、fruit.js function $(name) {if (name) {//假设name是 #fruit_tblif (name.startsWith("#")) {name name.substring(1); //fruit_tblreturn document.getElementById(name);} else {return document.getElementsByName(name);}} }//当页面加载完成后执行后面的…

Linux_包管理_apt相关命令的使用

以思维导图的形式整理了下apt相关的命令&#xff0c;便于查阅&#xff0c;主要分为软件源、安装卸载升级、查看&#xff1b; 1、软件源 2、安装、卸载、升级 3、查看 参考链接&#xff1a; Using apt Commands in Linux [Ultimate Guide] 6. apt更新软件源 — 快速使用手册—…

Kettle工具使用小结1

1.背景 客户数据库限定为tidb数据库&#xff0c;相关业务数据均存储在内。因为tidb数据库是分布式的&#xff0c;且不支持存储过程、job等功能&#xff0c;需要通过外部工具进行脚本批量处理&#xff0c;所以这里引入kettle进行脚本批量执行和作业调度。 2.环境信息 &#xf…

电影《惊奇队长2》观后感

上周看完了电影《惊奇队长2》&#xff0c;可能是最近国片看多了&#xff0c;看看国外电影还是感觉非常不错的&#xff0c;其中就有特效部分。目前来说&#xff0c;国内特效和国外还是有一定差距的&#xff0c;在过年时&#xff0c;备受好评的《流浪地球2》据说也是用的国外特效…

【Linux】安全审计-audit

文章目录 一、audit简介二、启auditd服务三、相关文件四、审计规则五、审计日志查询及分析 参考文章&#xff1a; 1、【安全】linux audit审计使用入门 2、audit详细使用配置 写在前面&#xff1a; 1.写博客&#xff0c;做日常工作记录&#xff0c;好记性不如烂笔头嘛&#x…

【AI视野·今日Sound 声学论文速览 第三十三期】Wed, 25 Oct 2023

AI视野今日CS.Sound 声学论文速览 Wed, 25 Oct 2023 Totally 8 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers CDSD: Chinese Dysarthria Speech Database Authors Mengyi Sun, Ming Gao, Xinchen Kang, Shiru Wang, Jun Du, Dengfeng Yao, Su Jing W…

Notepad++ 和正则表达式 只保留自己想要的内容

一、需求 如下文本&#xff0c;三段相同结构的数据&#xff0c;想要获取每段结构中‘重复的Ids ’后面的数字 2023-10-26 18:49:49 重复的Ids 26443,26575 要删除的Ids 4174,4199,4200,55502023-10-26 18:49:49 重复的Ids 26436,26443,26575 要删除的Ids 4166,4199,4200,5550…

WEB 自动化神器 TestCafe(一)—安装和入门篇

今天小编给大家带来WEB 自动化神器 TestCafe(一) —安装和入门篇 一、TestCafe 介绍&#xff1a; TestCafe 是一款基于 Node.js 的端到端 Web 自动化测试框架&#xff0c;支持 TypeScript 或 JavaScript 来编写测试用例&#xff0c;运行用例&#xff0c;并生成自动化测试报告。…

软件外包开发文档工具

有许多工具可用于生成和管理软件开发文档。这些工具可以帮助团队更有效地协作、记录和维护文档。以下是一些常用的软件开发文档生成工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 Javadoc&#…

ESP8266跟ESP-01S区别

看到了吧&#xff1a;ESP8266是一个芯片&#xff1b;ESP8266芯片是由外国的乐鑫公司生产的 ESP8266 Wi-Fi SoC | Espressif Systems ESP-01包含了ESP8266芯片&#xff0c;并且有一些外围电路&#xff0c;这个模块&#xff08;不是芯片&#xff09;是由中国的安可信公司生产的。…

2023最新软件测试20个基础面试题及答案

什么是软件测试&#xff1f; 答案&#xff1a;软件测试是指在预定的环境中运行程序&#xff0c;为了发现软件存在的错误、缺陷以及其他不符合要求的行为的过程。 软件测试的目的是什么&#xff1f; 答案&#xff1a;软件测试的主要目的是保证软件的质量&#xff0c;并尽可能大…

【深度学习实验】网络优化与正则化(六):逐层归一化方法——批量归一化、层归一化、权重归一化、局部响应归一化

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、优化算法0. 导入必要的库1. 随机梯度下降SGD算法a. PyTorch中的SGD优化器b. 使用SGD优化器的前馈神经网络 2.随机梯度下降的改进方法a. 学习率调整b. 梯度估计修正 3. 梯度估计修正&#xff1a;动量法Momen…

linux进程间通信之管道通信

Linux 进程间通信机制分三类&#xff1a;数据交互&#xff0c;同步&#xff0c;信号。理解了这些机制才能灵活运用操作系统提供的 IPC 工具。 一.管道 管道是一种文件形式&#xff0c;是内核的一块缓冲区。匿名管道只能用于具有亲缘关系的进程间通信&#xff0c;命名管道可以用…

C语言对10个数进行排序,使用快速排序算法

完整代码&#xff1a; // 对10个数进行排序&#xff0c;使用快速排序算法 #include<stdio.h>//用第一个元素将待排序序列划分成左右两个部分&#xff0c;返回排序后low的位置&#xff0c;即枢轴的位置 int partition(int arr[],int low,int high){//让待排序序列中的第一…

操作系统OS/存储管理/内存管理/内存管理的主要功能_基本原理_要求

基本概念 内存管理的主要功能/基本原理/要求 **内存管理的主要功能&#xff1a; ** 内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理&#xff0c;使程序员摆脱存储分配的麻烦&#xff0c;提高编程效率。地址转换。在多道程序环境下&#xff0c;程序中的逻辑地…