- 缓存
- KV存储
- 数据库
- 后端
【免费下载链接】redis
Native port of Redis for Windows. 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, Streams, HyperLogLogs. This repository contains unofficial port of Redis to Windows.
本文基于仓库根目录 Redis on Windows Release Notes.md 展开,围绕 MSOpenTech 维护的 Redis on Windows 3.2 系列两份官方发布记录(3.2.100 稳定版与 3.2.000-preview 技术预览版),逐项解析其变更日志背后的 Windows 移植原理,并结合仓库源码(
src/Win32_Interop/、src/cluster.c、src/rdb.c等)与 Windows 配置示例给出可验证的工程细节。读完本文,你将掌握该移植版在"数字解析可移植性、后台保存崩溃、集群故障转移通信、日志目录布局"四条核心问题线上的修复内容,以及评估其生产可用性的正确姿势。
一、版本发布概览
Redis on Windows 3.2 系列共发布两个版本,发布时间仅相隔约两周,性质与可用性定位截然不同:
| 版本 | 发布日期 | 版本性质 | 基线 | 生产可用性 |
|---|---|---|---|---|
| 3.2.000-preview | 2016-06-14 | 技术预览(Technical Preview) | antirez/redis/3.2 的 Windows 移植 | 严禁用于生产,存在已知 bug |
| 3.2.100 | 2016-07-01 | 首个稳定版(First Stable Release) | antirez/redis/3.2.1 + Windows 特定修复 | 已通过全部标准测试,但尚未经过生产环境验证 |
两条关键信息值得注意:
稳定版的判定标准:3.2.100 "has passed all the standard tests",但官方同时明确 "it hasn't been tested in a production environment"。因此文档给出明确的操作指引——在生产环境使用前,必须在自己的测试环境中进行充分测试。这直接对应仓库中随源码分发的测试体系:
runtest、runtest-cluster、runtest-sentinel三个入口脚本以及tests/下的单元测试(如 tests/unit/geo.tcl、tests/unit/bitfield.tcl)、集成测试与集群/哨兵测试套件。版本号规律:两个版本号共享 "3.2" 主版本,主版本号与上游 Redis 3.2 系列保持同步(3.2.000-preview 对应上游 3.2 分支起点,3.2.100 对应上游 tag
3.2.1合并),后缀段则用于表达该移植版的修复迭代状态。
二、3.2.100:首个稳定版的变更日志逐项解析
3.2.100 是 3.2 系列的第一个稳定版本,其变更日志共 8 项,可以归并为"可移植性修复、崩溃修复、网络通信修复、清理与布局调整、上游合并"五条主线。下面逐项结合仓库源码展开。
2.1 [Portability] strtol / strtoul 修复:Windows CRT 数字解析的可移植性
原文:
[Portability] strtol and strtoul fixes.
这是典型的 Windows 移植"隐雷":Windows CRT(C Runtime Library)与 Unix libc 在strtol/strtoul的返回类型与位数语义上存在差异——在 64 位 Windows 上,标准strtol返回long(仅 32 位),而 Redis 的许多解析路径期望 64 位整数语义。
仓库中的解决方式可在 Win32_APIs.h 中看到完整的宏映射:
#define strtoll _strtoi64 #ifdef _WIN64 #define strtol _strtoi64 #define strtoul _strtoui64 #endif- 在
_WIN64构建下,strtol被映射为_strtoi64、strtoul被映射为_strtoui64,即统一以 64 位__int64语义解析有符号/无符号整数; strtoll则无条件映射为_strtoi64。
这套宏在 Redis 源码中大量使用,例如:
- config.c 中解析
unixsocketperm(八进制权限位):server.unixsocketperm = (mode_t)strtol(argv[1], NULL, 8); - aof.c 中解析 AOF/RDB 文件头长度字段:
len = strtol(buf+1,NULL,10); - cluster.c 中解析集群配置的
currentEpoch/lastVoteEpoch:strtoull(...)。
如果没有这套位宽对齐,64 位 Windows 上这些解析点会因为截断到 32 位long而产生错误的数值,进而引发配置加载失败、集群纪元(epoch)错乱等隐性故障。3.2.100 针对这些解析函数的修复,是整个移植稳定性的基石之一。
2.2 [Fix] 后台保存期间可能的访问违规(AV)
原文:
[Fix] Possible AV during background save.
"AV" 指 Access Violation(访问违规,即 Windows 上的段错误/空指针解引用类崩溃),触发场景是BGSAVE等后台保存流程。Redis 在 Unix 上通过fork()实现后台 RDB 保存,而 Windows 没有原生fork,该移植通过QFork 机制模拟:相关实现集中在 Win32_QFork.cpp、Win32_QFork_impl.c 与头文件 Win32_QFork.h 中。
从源码调用关系看,rdb.c 在 Windows 分支下显式引入"Win32_Interop/Win32_QFork.h",而server.c、replication.c、config.c、debug.c、scripting.c等文件也涉及 bgsave 相关调用链(rdbSave、BGSAVE命令入口等),说明后台保存贯穿主服务、复制、持久化多个子系统。
可以推断:该 AV 大概率源于 QFork 子进程与主进程共享内存数据(RDB 快照遍历)时,对某些数据结构的读写出现不一致(例如快照过程中对象被并发释放或重分配),导致子进程访问无效内存。3.2.100 修复了该路径,这也是从"技术预览"走向"稳定版"所必须解决的崩溃级问题。修复前的 3.2.000-preview 版本存在多种已知 bug,恰好印证了这一修复的紧迫性。
2.3 [Fix] 使用重叠套接字(overlapped sockets)修复集群故障转移通信
原文:
[Fix] Use overlapped sockets for cluster failover communication.
集群故障转移(failover)是 Redis Cluster 的选举核心流程,涉及多类集群总线消息。3.2.100 将集群故障转移通信切换为 Windows 的重叠(overlapped)I/O 套接字模式。
从源码结构看,该修复贯穿两个层面:
(1)套接字抽象层:Win32_FDAPI.cpp 中的 FDAPI 封装族原生支持WSAOVERLAPPED语义,例如FDAPI_WSASend(L193-L208)、FDAPI_WSARecv(L211-L227)、FDAPI_AcceptEx(L286)、FDAPI_ConnectEx(L313)、FDAPI_WSAIoctl(L229),并通过RFDMap维护 rfd(Redis 文件描述符)到 SOCKET 的映射;相关声明位于 Win32_FDAPI.h 与 win32_wsiocp.h(WSIOCP:Windows Socket I/O Completion Port 抽象)。
(2)集群消息流程:cluster.c 中故障转移的完整调用链可以这样串联:
- 从节点发起选举:
clusterRequestFailoverAuth()(L2767-L2780)构造CLUSTERMSG_TYPE_FAILOVER_AUTH_REQUEST消息并广播给所有节点; - 主节点响应投票:
clusterSendFailoverAuthIfNeeded()(L2809-L2910)在满足条件后调用clusterSendFailoverAuth()发送CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK; - 消息落盘到连接:
clusterSendMessage()(L2312-L2315)将消息追加到link->sndbuf并注册写事件,最终由clusterWriteHandler()(L2227)通过write(fd, ...)写出。
在 Windows 上,这个write(fd, ...)最终落在 FDAPI 的重叠 I/O 套接字实现上。3.2.000-preview 的已知问题恰好点名了"集群故障转移功能在某些场景下无法正常工作",3.2.100 用重叠套接字修复了这条通信链路——这一配对关系从侧面印证了该修复正是预览版到稳定版的关键差异之一。
2.4 [Portability] Windows 可移植性修复
原文:
[Portability] Windows portability fixes.
这是一个覆盖面较广的归并项。结合仓库src/Win32_Interop/目录下的整体移植布局(Win32_APIs.h、Win32_Portability.h、Win32_ANSI.c、Win32_Time.c、Win32_ThreadControl.c、Win32_EventLog.cpp、Win32_RedisLog.c、win32fixes.c等),可以归纳移植版在 3.2 基线上的典型可移植性处理模式:
- 标准函数替换:如 Win32_APIs.h 中的
fseeko→_fseeki64、ftello→_ftelli64、snprintf→_snprintf、strcasecmp→_stricmp、sleep→Sleep、usleep→Sleep等; - 随机数替换:
random()/rand()→replace_random()、srandom→srand(Win32_APIs.h),用于绕开 Windows CRT 与 Redis 自研随机数种子机制的差异; - 文件操作替换:
rename→replace_rename、truncate()、lseek→lseek64(Win32_APIs.h),弥补 Windows 上对应 POSIX 语义的缺失。
3.2.100 的"Windows portability fixes"即是在合并上游 3.2.1 后,对这些移植层做的一次系统性收尾,确保上游新代码在 Windows 上编译、链接与运行行为一致。
2.5 Merged tag 3.2.1 from antirez/3.2:上游合并
原文:
Merged tag 3.2.1 from antirez/3.2.
3.2.100 与 3.2.000-preview 的基线差异:预览版基于上游 3.2 分支的 Windows 移植,而稳定版将上游 tag3.2.1(2016 年 6 月发布的上游维护版)合并进来,获得该 tag 中全部的上游 bug 修复与改进。这意味着稳定版同时承载了"上游 3.2.1 修复"与"Windows 移植修复"两个维度的更新。
2.6 [Setup] 日志子目录移除
原文:
[Setup] Removed subdir for log, the log is now saved in the main redis dir.
安装/默认布局变更:此前日志被写入子目录(如log/之类),3.2.100 起日志直接保存在主 Redis 目录。
仓库中两份 Windows 示例配置可以给出直观对照:
- redis.windows-service.conf:
logfile "server_log.txt"—— 服务模式下日志落在主目录下的server_log.txt,与dir ./(L239)配合,即工作目录即主目录; - redis.windows.conf:
logfile ""—— 交互/前台模式下日志输出到标准输出(配合logfile ""时 Redis 将日志打到 stdout / Windows 事件日志)。
与之配套,config.c 对logfile的解析在 Windows 分支下专门支持引号包裹的路径(含空字符串""与带引号的完整路径两种形态),并随即调用setLogFile()完成 Windows 侧日志重定向——这正是在 Windows 文件系统路径含空格等场景下为logfile "server_log.txt"这类写法提供的解析支撑。移除子目录后,无论是服务方式还是前台方式,日志路径语义都更简单、更贴近"开箱即用"。
2.7 [Cleanup] 清理工作
原文:
[Cleanup cleanup] Minor changes.与[Cleanup] Removed unused project.
两项清理性变更:合并上游后做了一些小规模整理(Minor changes),并移除了一个不再使用的工程/项目文件(Removed unused project)。这类变更不改变功能行为,属于发布前的工程卫生处理。
三、3.2.000-preview:技术预览版与已知问题
3.1 定位与使用边界
3.2.000-preview 发布于 2016-06-14,是 3.2 系列的技术预览版,性质上属于"给社区提前体验 Windows 移植进度"的版本。文档给出了明确的红线:
There are still known issues/bugs... This release SHOULD NOT be used in production.
即:存在已知问题/bug,不应在生产环境使用。它的主要价值在于让使用者提前验证 Windows 移植的编译、启动、基本命令兼容性,并收集问题反馈,为后续 3.2.100 稳定版提供迭代输入。
3.2 已知问题:集群故障转移失效场景
预览版最明确的已知问题来自集群子系统:
there is a bug that prevents the cluster fail-over functionality to work properly in certain scenarios.
即在某些场景下集群故障转移(fail-over)功能无法正常工作。结合上文 2.3 的源码分析,可以理解为什么该问题会在稳定版中被专项修复:
- 故障转移依赖多条集群总线消息(
FAILOVER_AUTH_REQUEST广播、FAILOVER_AUTH_ACK应答)在节点间的可靠收发; - 这些消息最终经由
clusterSendMessage → clusterWriteHandler → write(fd)落到套接字上; - 在 Windows 移植版中,套接字走 FDAPI 封装,其重叠 I/O 行为直接决定消息是否会在高并发/特定时序下丢失或错序。
3.2.100 将故障转移通信切换到 overlapped sockets 后,才解决了这类"特定场景失效"问题——这组"预览版已知 bug → 稳定版针对性修复"的对应关系,是阅读这份发布说明最有价值的一条线索。
四、3.2 基线的能力底色:从源码佐证看该移植版承载的功能
发布说明表明 3.2.100 合并了上游 3.2.1,因此其功能面以上游 Redis 3.2 系列为准。从当前仓库的源码与测试布局可以印证 3.2 基线携带的核心能力:
- GEO(地理位置)命令族:
src/geo.c、src/geohash.c、src/geohash_helper.c(含deps/geohash-int/内的 geohash 整数编码实现),配套测试 tests/unit/geo.tcl; - BITFIELD 位域命令:
src/bitops.c配套 tests/unit/bitfield.tcl; - QUICKLIST 列表数据结构(ziplist 节点 + 双向链表组合):
src/quicklist.c/src/quicklist.h,配套tests/unit/type/list*.tcl系列测试; - HyperLogLog、Streams 之前的数据模型:
src/hyperloglog.c等(Streams 属于更晚版本,本仓库中src/t_stream.c的存在说明该移植版基线已包含后续扩展,但发布说明明确记录的基线上游 tag 为 3.2.1)。
需要强调的是:发布说明本身聚焦于"版本发布与修复记录",上述功能特性属于"该基线天然携带的上游能力",本文仅作背景补充,帮助读者理解这个移植版所服务的数据模型与命令面。
五、总结:如何正确评估与使用该版本
综合两份发布记录,可以得到对该移植版的完整使用结论:
- 版本选择:3.2.000-preview 仅供技术预览与问题反馈,严禁用于生产;3.2.100 是 3.2 系列唯一稳定版,但官方明确其未经过生产环境验证——因此正式上线前必须在自有测试环境完成充分验证(含性能、稳定性、故障注入与集群场景),这一点是文档给出的硬性操作建议。
- 修复主线:3.2.100 的 8 项变更日志覆盖了数字解析位宽(
strtol/strtoul,见 Win32_APIs.h)、后台保存崩溃(QFork 路径,见 rdb.c)、集群故障转移通信(overlapped sockets,见 Win32_FDAPI.cpp 与 cluster.c)、日志布局(主目录直存,见 redis.windows-service.conf)四条工程主线。 - 排障参考:若在旧版遇到集群故障转移间歇失效,应优先检查套接字层(重叠 I/O)与集群消息收发链路;若遇到数值解析异常,应核对 64 位整数宏映射是否生效。
- 后续跟进:本仓库仍持续携带 Windows 移植工程(
msvs/下的 Visual Studio 工程与msvs/setups/documentation/的 Windows 专用配置、tests/windows/regression.tcl回归测试),如需深入可在这些路径继续阅读移植细节。
参考文件索引
- 发布说明原文:Redis on Windows Release Notes.md
- Windows 数字解析宏映射:Win32_APIs.h
- 后台保存与 QFork 接入:rdb.c、Win32_QFork.cpp、Win32_QFork_impl.c
- 重叠套接字封装:Win32_FDAPI.cpp、win32_wsiocp.c
- 集群故障转移流程:cluster.c
logfile解析(Windows 分支):config.c- Windows 示例配置:redis.windows-service.conf、redis.windows.conf
- 3.2 基线功能佐证:geo.c、bitops.c、quicklist.c、tests/unit/geo.tcl、tests/unit/bitfield.tcl
- 缓存
- KV存储
- 数据库
- 后端
【免费下载链接】redis
Native port of Redis for Windows. 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, Streams, HyperLogLogs. This repository contains unofficial port of Redis to Windows.
相关推荐
NumPy 1.9.1 发布说明深度解读:bugfix 版本的关键修复与迁移指引
NumPy 1.9.1 发布说明深度解读:bugfix 版本的关键修复与迁移指引 NumPy 1.9.1 是 1.9.x 系列中的一次纯缺陷修复(bugfix
科学计算数据分析Node.js v0.6.3 发布说明深度解读:npm 首次随 Node 分发与 Windows 平台关键修复
Node.js v0.6.3 发布说明深度解读:npm 首次随 Node 分发与 Windows 平台关键修复 本篇技术指南以 Node.js 官方博客的 v0
前端文档CloudNativePG 1.28 发布说明深度解读:Quorum 故障转移、声明式 FDW 与安全加固全解析
CloudNativePG 1.28 发布说明深度解读:Quorum 故障转移、声明式 FDW 与安全加固全解析 CloudNativePG 1.28 是 Ku
云原生数据库高可用灾备容器编排
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考