1. Windows平台下如何编译C++版本的Redis库hiredis
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
Redis的官网地址,非常好记,是redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地),Vmware在资助着redis项目的开发和维护。
从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
1、下载redis源码
GitHub - microsoftarchive/redis: Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes
2、编译代码
推荐使用VS2013,打开目录中的redis-3.0\msvs\RedisServer.sln,编译即可,如果提示以下错误,需要适当修改代码,后面的依次类推:
1>..\..\src\ae.c(187): error C2275: “aeFileEvent”: 将此类型用作表达式非法
1> c:\users\administrator\desktop\redis-3.0\src\ae.h(67) : 参见“aeFileEvent”的声明
1>..\..\src\ae.c(187): error C2065: “fe”: 未声明的标识符
1>..\..\src\ae.c(189): error C2065: “fe”: 未声明的标识符
1>..\..\src\ae.c(189): error C2223: “->mask”的左侧必须指向结构/联合
比如编译会出现报错的函数:
int aeGetFileEvents(aeEventLoop *eventLoop, int fd) {if (fd >= eventLoop->setsize) return 0;aeFileEvent *fe = &eventLoop->events[fd];return fe->mask;
}
由于C文件编译器中限定变量需要放在最前面,函数体中间不允许临时定义变量,故参照下面的方式修改即可:
int aeGetFileEvents(aeEventLoop *eventLoop, int fd) {aeFileEvent *fe = NULL;if (fd >= eventLoop->setsize) return 0;fe = &eventLoop->events[fd];return fe->mask;
}
修改完毕后重新编译即可!

3、生成静态lib文件
生成的文件位于:redis-3.0\msvs\Win32\Release,如下图,在后续工程中只需要引用此LIB即可在VS C++环境中编译你的应用:

4、运行Redis服务端:
先将配置文件redis-3.0\redis.conf拷贝上面的EXE所在目录:

通常只需要修改redis.conf中的几个常用参数
# 侦听端口(默认)
port 6379# 数据库本地的文件名
dbfilename dump.rdb# 修改访问密码
################################## SECURITY ###################################
requirepass admin
最后在命令行运行 redis-server.exe redis.conf 即可启动服务端:

下一章节将讲解在Redis常见命令及对比MySQL细节!
注意:
由于hiredis是在VS2013编译生成的,否则测试工程必须要用VS2013或以上的版本,否则会提示下面的错误:
1> 所有输出均为最新。
1>MSVCRTD.lib(ti_inst.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(xlock.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(stdthrow.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(xthrow.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(uncaught.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(locale0.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(xdebug.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(ios.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(cerr.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(iosptrs.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>libcpmtd.lib(xmutex.obj) : error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800”(Win32_Interop.lib(Win32_FDAPI.obj) 中)
1>LINK : warning LNK4098: 默认库“LIBCMTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
1>hiredis.lib(hiredis.obj) : error LNK2019: 无法解析的外部符号 ___report_rangecheckfailure,该符号在函数 _redisvFormatCommand 中被引用
1>Win32_Interop.lib(Win32_Error.obj) : error LNK2001: 无法解析的外部符号 ___report_rangecheckfailure
1>Win32_Interop.lib(Win32_FDAPI.obj) : error LNK2001: 无法解析的外部符号 ___report_rangecheckfailure
1>Win32_Interop.lib(Win32_ANSI.obj) : error LNK2001: 无法解析的外部符号 ___report_rangecheckfailure
1>hiredis.lib(hiredis.obj) : error LNK2019: 无法解析的外部符号 __vacopy,该符号在函数 _redisvFormatCommand 中被引用
1>hiredis.lib(sds.obj) : error LNK2001: 无法解析的外部符号 __vacopy
1>Win32_Interop.lib(Win32_FDAPI.obj) : error LNK2019: 无法解析的外部符号 "void __cdecl std::_Xbad_alloc(void)" (?_Xbad_alloc@std@@YAXXZ),该符号在函数 "char * __cdecl std::_Allocate<char>(unsigned int,char *)" (??$_Allocate@D@std@@YAPADIPAD@Z) 中被引用
1>Win32_Interop.lib(win32_rfdmap.obj) : error LNK2001: 无法解析的外部符号 "void __cdecl std::_Xbad_alloc(void)" (?_Xbad_alloc@std@@YAXXZ)
1>Win32_Interop.lib(Win32_variadicFunctor.obj) : error LNK2001: 无法解析的外部符号 "void __cdecl std::_Xbad_alloc(void)" (?_Xbad_alloc@std@@YAXXZ)
1>Win32_Interop.lib(Win32_EventLog.obj) : error LNK2001: 无法解析的外部符号 "void __cdecl std::_Xbad_alloc(void)" (?_Xbad_alloc@std@@YAXXZ)
1>Win32_Interop.lib(Win32_FDAPI.obj) : error LNK2019: 无法解析的外部符号 "char const * __cdecl std::_Syserror_map(int)" (?_Syserror_map@std@@YAPBDH@Z),该符号在函数 "public: virtual class std::error_condition __thiscall std::_System_error_category::default_error_condition(int)const " (?default_error_condition@_System_error_category@std@@UBE?AVerror_condition@2@H@Z) 中被引用
1>Win32_Interop.lib(Win32_variadicFunctor.obj) : error LNK2001: 无法解析的外部符号 "char const * __cdecl std::_Syserror_map(int)" (?_Syserror_map@std@@YAPBDH@Z)
1>Win32_Interop.lib(Win32_EventLog.obj) : error LNK2001: 无法解析的外部符号 "char const * __cdecl std::_Syserror_map(int)" (?_Syserror_map@std@@YAPBDH@Z)
1>Win32_Interop.lib(Win32_FDAPI.obj) : error LNK2019: 无法解析的外部符号 "char const * __cdecl std::_Winerror_map(int)" (?_Winerror_map@std@@YAPBDH@Z),该符号在函数 "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall std::_System_error_category::message(int)const " (?message@_System_error_category@std@@UBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@H@Z) 中被引用
1>Win32_Interop.lib(Win32_variadicFunctor.obj) : error LNK2001: 无法解析的外部符号 "char const * __cdecl std::_Winerror_map(int)" (?_Winerror_map@std@@YAPBDH@Z)
1>Win32_Interop.lib(Win32_EventLog.obj) : error LNK2001: 无法解析的外部符号 "char const * __cdecl std::_Winerror_map(int)" (?_Winerror_map@std@@YAPBDH@Z)
1>Win32_Interop.lib(Win32_EventLog.obj) : error LNK2019: 无法解析的外部符号 "void __cdecl std::_Facet_Register(class std::_Facet_base *)" (?_Facet_Register@std@@YAXPAV_Facet_base@1@@Z),该符号在函数 "class std::ctype<char> const & __cdecl std::use_facet<class std::ctype<char> >(class std::locale const &)" (??$use_facet@V?$ctype@D@std@@@std@@YAABV?$ctype@D@0@ABVlocale@0@@Z) 中被引用
1>Win32_Interop.lib(Win32_EventLog.obj) : error LNK2019: 无法解析的外部符号 "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(bool)" (?_Init@locale@std@@CAPAV_Locimp@12@_N@Z),该符号在函数 "public: __thiscall std::locale::locale(void)" (??0locale@std@@QAE@XZ) 中被引用
1>Win32_Interop.lib(Win32_Time.obj) : error LNK2019: 无法解析的外部符号 __dtoul3,该符号在函数 _GetHighResRelativeTime 中被引用
1>Win32_Interop.lib(Win32_Time.obj) : error LNK2019: 无法解析的外部符号 __ltod3,该符号在函数 _GetHighResRelativeTime 中被引用
1>C:\Users\Administrator\Desktop\RedisTest\Debug\RedisTest.exe : fatal error LNK1120: 9 个无法解析的外部命令
1>
1>生成失败。
1>
1>已用时间 00:00:01.53
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
避坑指南:这个版本似乎不太稳定,主进程EXE这些推荐使用官方的版本,在此我们只需要用它的lib库即可!
相关文章:
1. Windows平台下如何编译C++版本的Redis库hiredis
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并…...
Centos中利用自带的定时器Crontab_实现mysql数据库自动备份_linux中mysql自动备份脚本---Linux运维工作笔记056
这个经常需要,怕出问题因而需要经常备份数据库,可以利用centos自带的定时器,配合脚本实现自动备份. 1.首先查看一下,这个crontab服务有没有打开: 执行:ntsysv 可以看到已经开机自启动了. 注意这个操作界面,用鼠标不行,需要用,tab按键,直接tab到确定,或取消,然后按回车回到命…...
完美解决Android adb install 安装提示 INSTALL_FAILED_TEST_ONLY
完美解决Android adb install 安装提示 INSTALL_FAILED_TEST_ONLY 目录 所遇问题 有些时候我们用命令进行安装apk如下: adb install xxx.apk但是会安装不成功,报如下错误: 错误现象:提示:Failed to install app-d…...
[清华大学]漏洞挖掘之状态敏感的模糊测试StateFuzz
Dr.赵博栋 Prof.张超 清华大学 网络研究院 INSC 本文主要介绍了通过State Fuzz对Linux驱动程序进行模糊测试,该Fuzz方法由赵博栋博士在InForSec会议上分享,并在USENIX Security上发布.StateFuzz :System Call-Based State-Aware Linux Driver Fuzzing.该…...
嵌入式养成计划-40----C++菱形继承--虚继承--多态--模板--异常
九十四、菱形继承 94.1 概念 菱形继承又称为钻石继承,是由公共基类派生出多个中间子类,又由中间子类共同派生出汇聚子类,汇聚子类会得到多份中间子类从公共基类继承下来的数据成员,会造成空间浪费,没有必要。 所以存…...
C++入门指南:类和对象总结友元类笔记(下)
C入门指南:类和对象总结友元类笔记(下) 一、深度剖析构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字 二、static成员2.1 概念2.2 特性 三、友元3.1 友元函数3.2 友元类 四、 内部类4.1 概念4.2 特征 五、拷贝对象时的一些编译器优化六、深…...
ctfshow web入门 php特性 web136-web140
1.web136 还有一种写文件的命令时tee命令 payload: : ls /|tee 1 访问1下载查看文件1发现根目录下有flag cat /f149_15_h3r3|tee 2 访问下载查看文件22.web137 call_user_func <?php class myclass {static function say_hello(){echo "He…...
sshpass传输文件提示Host key verification failed.
1. sshpass功能简述 sshpass指令可用于A服务器向B服务器传输文件或执行某些指令。 2. 传输文件指令 基本传输命令:sshpass -p 远程服务器登录密码 scp 本地路径文件 远程服务器登录用户名远程服务器IP地址:远程服务器文件保存路径 示例: sshpass -p 1…...
Maven系列第5篇:私服详解
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。 这是maven系列第5篇。 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。 环境 maven3.6.1 …...
深入解析Spring Cloud Gateway的GlobalFilter
文章目录 摘要引言GlobalFilter的作用使用GlobalFilter默认的GlobalFilter自定义GlobalFilter 示例代码配置GlobalFilter配置文件方式代码方式 高级用法:重写GlobalFilter思路代码实现 结论参考文献 摘要 本文将详细介绍Spring Cloud Gateway中的GlobalFilter&…...
ffmpeg的重采样计算
最近在看ffmpeg的重采样计算逻辑,有一句话没大看懂 dst_nb_samples av_rescale_rnd(swr_get_delay(swr_ctx, src_rate) src_nb_samples, dst_rate, src_rate, AV_ROUND_UP); ,各种请教之后,记录如下。 重采样后的总样本数 为什么要涵盖重采…...
Go HTTP 调用(上)
哈喽大家好,我是陈明勇,今天分享的内容是 Go HTTP 调用。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出&am…...
STM32Cube高效开发教程<基础篇>(一)----概述
声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。 本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。 一、 STM32系列…...
汽车RNC主动降噪算法DSP C程序实现
汽车RNC主动降噪算法C程序 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,车载...
Java21虚拟线程完整用法
方式1 Thread.startVirtualThread(new Task());方式2 Thread virtualThread Thread.ofVirtual().name("Virtual Thread").unstarted(new Task()); virtualThread.start();方式3 Thread.ofVirtual().name("Virtual Thread").start(new Task());方式4 Th…...
Vue 中的 nextTick 方法
nextTick的背景 Vue 使用虚拟 DOM(Virtual DOM)和异步更新策略来实现高效的视图更新。当你修改 Vue 实例的数据时,Vue 并不会立即更新真实的 DOM,而是将更新操作加入到队列中,在下一个事件循环周期(微任务…...
TypeScript React(上)
目录 扩展学习资料 TypeScript设计原则 TypeScript基础 语法基础 变量声明 JavaScript声明变量 TypeScript声明变量 示例 接口 (标准类型-Interface) 类型别名-Type 接口 VS 类型别名 类型断言:欺骗TS,肯定数据符合结构 泛型、<大写字母> 扩展学习…...
Linux 安全 - LSM源码分析
文章目录 前言一、简介1.1 DAC 和 MAC1.2 LSM 调用流程图 二、LSM相关数据结构2.1 struct security_hook_list2.2 union security_list_options2.3 structure security_hook_heads 三、security_bprm_check四、LSM 源码分析3.1 early_security_init3.2 security_init3.2.1 secu…...
第一次汇报相关问题
深度学习现在已经学习到了Mini-Batch,early-stop等针对特定场景优化的算法了。 代码已经实现了一个L层的神经网络的构建了 论文看了一些综述 主要思考的两个方向:云计算和嵌入式 云计算:分布式机器学习、联邦学习、服务器负载均衡等 嵌入式&…...
[产品体验] GPT4识图功能
[产品体验] GPT4识图功能 图片配文字超强的OCR能力知识问答多图解释 打开chatgpt的时候突然发现能用识图了,赶紧去体验一下,大大的震撼… 图片配文字 超强的OCR能力 我传上去的图片并不清晰… 还能准确识别,orz ! 知识问答 多…...
多智能体强化学习中的分层安全架构设计与实现
1. 多智能体强化学习中的分层安全架构设计在复杂动态环境中实现多智能体系统的安全协调一直是个极具挑战性的问题。传统方法要么过于保守导致效率低下,要么缺乏理论安全保障。我们提出的分层安全架构通过将智能体邻近空间划分为三个明确区域,为这一问题提…...
无代码物联网水浸检测系统:基于Adafruit FunHouse与WipperSnapper的快速搭建指南
1. 项目概述:当漏水警报响起时,你正在悠闲地喝咖啡地下室的水管是不是又漏了?空调的冷凝水是不是溢出来了?放在角落的鱼缸有没有裂开?对于很多家庭用户、小型工作室管理员或是物业设施维护人员来说,水患是潜…...
NotebookLM电影文献处理失效真相:92%研究者忽略的3类语义断层及修复方案
更多请点击: https://kaifayun.com 第一章:NotebookLM电影研究辅助 NotebookLM 是 Google 推出的基于 AI 的研究协作者,专为深度阅读与知识整合设计。在电影研究场景中,它能高效解析剧本、影评、导演访谈、学术论文等多源文本&am…...
Manus Open Claw开源技能库:构建可共享的机器人抓取解决方案
1. 项目概述:一个面向机器人抓取的开源技能库最近在机器人抓取领域,一个名为simpliolabs/manus-open-claw-skill-hunter-and-developer的项目引起了我的注意。乍一看这个标题,信息量不小,它融合了“开放爪具”、“技能猎人”和“开…...
Adobe-GenP 3.0终极指南:5分钟快速激活Adobe全系列专业软件
Adobe-GenP 3.0终极指南:5分钟快速激活Adobe全系列专业软件 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP是一款专门为Adobe Creative Clou…...
JVM性能调优实战:从GC日志分析到内存泄漏排查的完整工具链
1. 项目概述:从“感觉卡顿”到“数据说话”的JVM调优之路在电商大促、金融交易峰值或者物联网设备海量上报的瞬间,后台服务的响应延迟哪怕增加几十毫秒,都可能直接转化为用户流失或交易失败。作为一线开发者,我们常常会收到“系统…...
基于SpringBoot的汽车美容养护管理系统的设计与开发
一、选题依据和意义 (一)选题依据 随着国内汽车保有量持续攀升,汽车后市场规模不断扩大,汽车美容养护行业迎来快速发展期,但行业整体仍存在管理效率低下、服务流程不规范等问题[1]。传统管理模式依赖人工记录客户信息…...
3分钟解决Windows软件兼容性难题:Visual C++运行库一键修复全攻略
3分钟解决Windows软件兼容性难题:Visual C运行库一键修复全攻略 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾因游戏无法启动而沮丧&#…...
StreamFX终极指南:5个简单技巧打造专业级OBS直播画面
StreamFX终极指南:5个简单技巧打造专业级OBS直播画面 【免费下载链接】obs-StreamFX StreamFX is a plugin for OBS Studio which adds many new effects, filters, sources, transitions and encoders! Be it 3D Transform, Blur, complex Masking, or even custom…...
【嵌入式 AI 实战第 9 期】环境感知(一)气体传感器阵列与数据采集(附完整 C 语言驱动)
一、前言在物联网与人工智能快速发展的今天,环境感知能力已成为智能设备的核心功能之一。气体传感器作为环境感知的 "嗅觉器官",广泛应用于智能家居、工业安全、农业生产、医疗诊断等领域。传统的单一气体传感器只能检测特定类型的气体&#x…...
