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库即可!

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

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

相关文章

HTTP长连接实现原理

1. HTTP长连接和短连接的定义 HTTP长连接 浏览器向服务器进行一次HTTP会话访问后&#xff0c;并不会直接关闭这个连接&#xff0c;而是会默认保持一段时间&#xff0c;那么下一次浏览器继续访问的时候就会再次利用到这个连接。在HTTP/1.1版本中&#xff0c;默认的连接都是长连…

JVM面试题:(二)内存结构和内存溢出、方法区的两种实现

内存结构&#xff1a; 方法区和对是所有线程共享的内存区域&#xff1b;而java栈、本地方法栈和程序员计数器是运行是线程私有 的内存区域。 Java堆&#xff08;Heap&#xff09;,是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内 存区域&#xff0c;在…

VuePress实现自动获取文章侧边栏目录功能

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

MFC 鼠标悬停提示框

MFC 鼠标悬停提示框 运行效果 在MFC窗口中添加一个控件 工具栏中拖拽List Box到MFC窗口给List Box添加变量 CListBox m_listbox 增加成员变量 CWnd* m_tip_parent_wnd; CToolTipCtrl m_tip;给m_listbox创建提示框 void create_tip_window(CWnd* tip_wnd, CToolTipCtrl* ti…

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 创建虚拟机

文章目录 一、虚拟机二、关于消息的API发布消息直接交换机 DIRECT 转发规则扇出交换机 FANOUT 转发规则主题交换机 TOPIC 转发规则匹配规则Router类 订阅消息消费者队列如何给订阅的消费者发送消息自动发送消息至订阅者 应答消息 三、代码编写 一、虚拟机 接下来要创建虚拟机,…

el-date-picker增加默认值 修改样式

预期效果 默认是这样的 但希望是直接有一个默认的当天日期&#xff0c;并且字体颜色啥的样式也要修改&#xff08;在这里假设今天是2023/10/6 功能实现 踩了坑挺多坑的&#xff0c;特此记录 官方文档 按照官方的说明&#xff0c;给v-model绑定一个字符串就可以了 在j…

AI能否取代程序员:探讨人工智能在编程领域的角色

引言&#xff1a; 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;人们开始思考&#xff1a;AI是否能够取代程序员&#xff1f;这个问题引发了广泛的讨论和辩论。一些人认为&#xff0c;AI的出现将彻底改变编程的面貌&#xff0c;而另一些人则坚信&#xf…

大数据之LibrA数据库系统介绍

简介 LibrA是一个基于开源数据库Postgres-XC开发的分布式并行关系型数据库系统。 LibrA提供了以下功能&#xff1a; 标准SQL支持 支持标准的SQL92/SQL2003规范&#xff0c;支持GBK和UTF-8字符集&#xff0c;支持SQL标准函数与OLAP分析函数&#xff0c;支持存储过程。 数据库…

微信支付v2

文档&#xff1a; https://pay.weixin.qq.com/wiki/doc/api/index.html 微信小程序&#xff1a;https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter11_1 需要一个微信认证后的小程序&#xff0c;&#xff0c;还需要一个&#xff0c;在微信商户平台&#xff0c;&…

串级/级联控制知识点整理

串级控制系统是改善控制质量的有效方法之一&#xff0c;在过程控制中得到了广泛的应用。所谓串级控制&#xff0c;就是采用两个控制器串联工作&#xff0c;外环控制器的输出作为内环控制器的设定值&#xff0c;由内环控制器的输出去操纵控制阀&#xff0c;从而对外环被控量具有…

mysql8压缩包安装

MySQL 8.0 版压缩包安装教程_mysql 压缩包 8.0安装-CSDN博客 1、mysql压缩包 2、参考链接一步一步操作即可。 3、安装&#xff0c;破解navicat. 4、无法连接&#xff0c;参考该链接修改&#xff1a; Mysql 解决1251- Client does not support authentication protocol reques…

android app开发环境搭建

Android是流行的移动设备原生应用开发平台&#xff0c;其支持Java语言以及Kotlin语言的开发环境&#xff0c;本文主要描述官方提供的Android studio集成开发环境搭建。 https://developer.android.google.cn/ 如上所示&#xff0c;从官方上下载最新版本的Android studio集成开…

【DevOps】搭建你的第一个 Docker 应用栈

搭建你的第一个 Docker 应用栈 1.Docker 集群部署2.第一个 Hello World2.1 获取应用栈各节点所需镜像2.2 应用栈容器节点互联2.3 应用栈容器节点启动2.4 应用栈容器节点的配置2.4.1 Redis Master 主数据库容器节点的配置2.4.2 Redis Slave 从数据库容器节点的配置2.4.3 Redis 数…

[NISACTF 2022]join-us - 报错注入无列名注入

[NISACTF 2022]join-us 解题流程 解题流程 点击登录&#xff0c;找到注入点 这种框&#xff0c;可以直接爆破关键字&#xff0c;看是否拦截&#xff0c;也可以手动尝试&#xff0c;发现、union、and、or、substr、database等关键字都拦截了 1、学到了&#xff1a;可以用数据库…

pytorch学习------TensorBoard的使用

目录 简介使用方式1、单条曲线(scalar)2、多条曲线(scalars)3、直方图(histogram)4、图片(image)5、渲染(figure)6、网络(graph) 简介 建好一个神经网络&#xff0c;其实我们也不知道神经网络里头具体细节到底做了什么&#xff0c;要人工调试十分困难(就好比你无法想象出递归的…

SpringCloud之Stream框架集成RocketMQ消息中间件

Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架。它可以基于 Spring Boot 来创建独立的、可用于生产的 Spring 应用程序。Spring Cloud Stream 为一些供应商的消息中间件产品提供了个性化的自动化配置实现&#xff0c;并引入了发布-订阅、消费组、分区这三…

SQL Server 简介与 Docker Compose 部署

今天我翻阅了在之前公司工作时的笔记&#xff0c;发现了有关数据库的一些记录。当时&#xff0c;我们的项目开始使用 Oracle 数据库&#xff0c;但后来由于一些项目需求的变更&#xff0c;我们切换到了 SQL Server 。值得一提的是&#xff0c;公司当时也开始采用 Docker 技术&a…

c++模板库容器list vector map set操作和性能对比

文章目录 listvectormapset性能比较总结 list 列表&#xff08;list&#xff09;是C STL中的一种容器类型&#xff0c;它是一个双向链表&#xff0c;可以在任意位置高效地添加、删除、移动元素。 以下是一些常用的列表操作&#xff1a; 创建列表 #include <list> std…

Jetson Orin NX 开发指南(1): 系统烧录

一、SDK Manager SDK Manager 工具是 NVIDIA 官方推荐的烧写和管理 Jetpack 系统组件的一个图形化烧写工具&#xff0c;使用起来非常的简单方便&#xff0c;但是该软件需要在 x86 的 Ubuntu 18.04 或 Ubuntu 20.04 的系统上运行&#xff0c;因此我们需要准备一台安装了 Ubuntu…

记录:Unity脚本的编写3.0

目录 前言前置控制方法查看效果移动方式 前言 前面记录了一些通过脚本控制对象模型移动和通过用户的操作对模型进行变化的方法&#xff0c;那么为了让我们创造的不论是地形还是模型都拥有真实的物理引擎&#xff08;大雾&#xff09;&#xff0c;那么这次就使用脚本控制模型感…