尧图精选

Redis 在 Windows 上以服务方式运行的完整指南:MSI 安装、`--service-*` 命令与多实例管理

🕒 发布时间:2026/10/1 22:49:07 📁 来源:尧图网络
数据库KV存储缓存【免费下载链接】redisRedis 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项目地址https://gitcode.com/gh_mirrors/redi/redis点击查看免费下载导读Redis 是典型的 POSIX 程序但在 Windows 移植版中它被深度改造既能随 MSI 安装包自动注册为 Windows 服务也内置了一整套--service-install / --service-uninstall / --service-start / --service-stop / --service-name服务管理命令供未使用 MSI 安装的部署场景使用。本文以仓库根目录的 Windows Service Documentation.md 为核心骨架结合 Win32_service.cpp、Win32_CommandLine.cpp 等源码与 MSI 工程 Product.wxs 的实现细节完整讲解两种服务化部署路径、命令行参数语义、配置要点与多实例运维方案。读完本文你可以在一台 Windows 服务器上完成 Redis 服务的安装、启停、卸载并部署多个相互独立的 Redis 服务实例。一、概述把 Redis 变成 Windows 服务的两条路径在 Windows 移植版中Redis 可以通过两种方式运行成 Windows 服务MSI 安装包方式使用仓库 msvs 目录下的 MSI 工程打包安装。安装完成后 Redis 自动被注册为名为Redis的 Windows 服务并随系统自启动无需任何额外操作。命令行手工方式针对没有使用 MSI 安装的二进制分发场景redis-server.exe内置了专门的服务管理命令--service-*系列可以直接把当前二进制注册为服务并支持指定服务名实现单机多实例。第一条路径适合大多数“装完即用”的场景第二条路径适合需要精细控制服务名、启动参数与多实例的运维场景。原文档 Windows Service Documentation.md 对这两条路径的完整命令均有说明下文逐一展开。二、方式一MSI 安装包自动安装为服务2.1 安装即服务改配置、重启服务如果使用 MSI 安装包安装 Redis安装程序会自动完成 Windows 服务注册。原文档明确指出If you installed Redis using the MSI package, then Redis was already installed as a Windows service. Nothing further to do.也就是说MSI 安装完成后服务即已存在默认服务名为Redis启动类型为自动。后续如需调整运行参数只需要修改服务使用的配置文件redis.windows-service.conf然后重启服务修改文件redis.windows-service.conf仓库内附带的服务专用配置模板安装后会部署到安装目录重启服务Win R打开运行框输入services.msc打开服务管理器找到Redis服务右键 → 重启Restart这条路径的关键点在于服务读取的是专用配置文件而不是交互式启动时常用的 redis.windows.conf。服务版配置与普通配置的主要差异体现在日志与持久化相关项上后文第四节会专门说明。2.2 MSI 的交互式安装与静默安装MSI 安装时既可以使用安装器自带的图形界面UI来设置监听端口与防火墙例外也可以通过命令行参数在无 UI 的情况下静默安装。原文档给出了四组标准命令默认安装端口 6379开启防火墙例外msiexec /i Redis-x64.msi自定义端口并关闭防火墙例外msiexec /i Redis-x64.msi PORT1234 FIREWALL_ON自定义端口并开启防火墙例外msiexec /i Redis-x64.msi PORT1234 FIREWALL_ON1无用户界面的静默安装msiexec /quiet /i Redis-x64.msi其中/quiet表示不显示任何 UIPORT指定 Redis 的 TCP 监听端口FIREWALL_ON控制是否在 Windows 防火墙中为指定端口添加例外规则空字符串表示关闭、1表示开启。2.3 从 MSI 工程源码看安装参数的真实语义为了让参数含义更精确可以对照仓库中的 WiX 安装工程源码 Product.wxs。该文件中定义的属性与默认值如下PORT默认6379Property IdPORT Value6379 /ADD_FIREWALL_RULE默认1即默认开启防火墙例外FIREWALL_SERVICE_STOPPED默认0用于检测防火墙服务是否停止MAXMEMORY默认100即最大内存限制MBUSE_MEMORY_LIMITS是否启用内存限制ADD_INSTALLFOLDER_TO_PATH是否把安装目录加入 PATH注意原文档命令行示例中使用的是FIREWALL_ON而仓库 MSI 工程中实际使用的属性名是ADD_FIREWALL_RULE例如工程注释给出的示例为msiexec /i Redis-[version].msi PORT1234 ADD_FIREWALL_RULE msiexec /i Redis-[version].msi PORT1234 ADD_FIREWALL_RULE1两者语义一致空值关闭、1开启。在命令行实际传参时建议以 Product.wxs 中的属性名ADD_FIREWALL_RULE为准并留意 MSI 版本差异。此外安装流程并不只是简单注册服务。从 CustomActions.wxs 可以看到安装时自定义操作会把PORT、MAXMEMORY、USE_MEMORY_LIMITS等参数写入服务版配置文件对应ca_UpdateRedisConfig自定义操作传递CONFIG_PATH[...];PORT[PORT];MAXMEMORY[MAXMEMORY];USE_MEMORY_LIMITS[USE_MEMORY_LIMITS]并且只有当防火墙服务正常运行FIREWALL_SERVICE_STOPPED 1且用户勾选了ADD_FIREWALL_RULE时才会添加防火墙规则见 WindowsServiceComponents.wxs。也就是说MSI 安装会把 UI/命令行里选择的端口、内存上限直接写进服务所用配置这正是“安装即服务、改端口只需重装或改配置”的底层机制。2.4 MSI 安装后的服务管理MSI 安装完成后服务以NT AUTHORITY\NetworkService账户运行见下文源码分析并配置为Autostart自动启动。日常管理动作只有两类改配置编辑redis.windows-service.conf端口、日志、maxmemory等随后在services.msc中重启Redis服务卸载通过“控制面板 → 程序卸载”或msiexec /x Redis-x64.msi卸载服务注册信息随之移除。三、方式二用redis-server自带的服务命令手工注册如果没有使用 MSI 安装例如直接拷贝官方二进制发布包仍然可以把 Redis 跑成 Windows 服务。Windows 移植版为此在redis-server.exe中新增了一组专门的服务命令参数。3.1 服务命令的提权机制重要前提原文档特别强调这些服务命令需要以提升权限elevated的上下文运行因为注册、启停服务都需要连接 Windows 的服务控制管理器Service Control ManagerSCM。These service arguments require an elevated user context in order to connect to the service control manager.如果从非提升的命令提示符普通 cmd调用这些命令Redis 会尝试自动创建提升上下文来执行Windows 会弹出UAC用户账户控制对话框并可能要求输入管理员凭据才能继续。因此有两种做法直接右键“以管理员身份运行”cmd 再执行服务命令避免 UAC 弹窗或者接受 UAC 弹窗让 Redis 内部通过ShellExecuteExrunasverb自我提权后执行。这一机制的源码实现在 Win32_service.cpp 的HandleServiceCommands第 666 行起每个服务命令首先检查IsProcessElevated()若当前进程未提权则调用RelaunchAsElevatedProcess(argc, argv)以管理员身份重新启动自身并通过命名管道\\.\pipe\redis-service-install把执行结果回传给原进程显示。3.2--service-install安装服务该参数必须是redis-server命令行中的第一个参数其后的所有参数会按出现顺序原样保存在服务定义中待服务启动时再传给 Redis 执行。安装行为的完整定义如下与 Win32_service.cpp 头部的注释文档完全一致服务被配置为Autostart自启动服务账户为NT AUTHORITY\NetworkService安装成功后显示成功消息随后 Redis 进程退出该命令不会启动服务需要单独执行--service-start。示例安装服务并传配置参数redis-server --service-install redis.windows.conf --loglevel verbose这个命令的含义是安装名为Redis的服务服务启动时执行redis-server --service-run redis.windows.conf --loglevel verbose。注意源码中安装时会把--service-install替换为内部专用的--service-run参数见 Win32_service.cpp 第 298-300 行--service-run是服务主进程真正运行的入口属于内部实现细节无需手工使用。安装过程的源码行为ServiceInstallWin32_service.cpp 第 279 行起还包括通过CreateServiceA调用 SCM API 注册服务类型为SERVICE_WIN32_OWN_PROCESS、启动方式为SERVICE_AUTO_START、账户为NT AUTHORITY\NetworkService调用ChangeServiceConfig2设置preshutdown 超时180 秒用于系统关机时优雅清理内存映射文件注册 Windows事件日志源RedisEventLog().InstallEventLogSource此后服务初始化错误可以写入事件日志自动为NetworkService账户授予配置文件、AOF、RDB 等路径的读写权限SetAccessACLOnFolder避免服务因无权写文件而启动失败。3.3--service-uninstall卸载服务该命令从注册表中移除 Redis 服务的配置信息。行为要点卸载成功后显示成功消息并退出该命令不会停止服务若服务正在运行需先执行--service-stop或在服务管理器中停止。示例redis-server --service-uninstall源码实现ServiceUninstall第 427 行起会打开服务并调用DeleteService随后调用RedisEventLog().UninstallEventLogSource()移除事件日志源。3.4--service-start启动服务启动之前通过--service-install注册好的 Redis 服务。成功启动后显示成功消息Redis 开始运行。示例redis-server --service-start源码实现ServiceStart第 353 行起调用StartServiceA后轮询QueryServiceStatus等待服务进入SERVICE_RUNNING状态最长等待 30 秒若超时则报告 “Redis service start timed out”。这也解释了为什么安装后启动通常需要等待一两秒——源码中在启动调用后先Sleep(2000)再轮询状态。3.5--service-stop停止服务停止当前运行的 Redis 服务成功终止后显示成功消息。示例redis-server --service-stop源码实现ServiceStop第 394 行起通过ControlService(SERVICE_CONTROL_STOP)发送停止控制码并轮询等待服务进入SERVICE_STOPPED状态同样有 30 秒超时保护。3.6--service-name命名服务与多实例部署--service-name是可选参数可与上述任何服务命令组合使用用来指定目标服务名。参数位置有严格要求必须紧跟在其修饰的服务命令install/start/stop/uninstall之后并先于要通过--service-install传给 Redis 的其他参数。原文档给出了一个非常典型的单机三实例部署示例redis-server --service-install --service-name redisService1 --port 10001 redis-server --service-start --service-name redisService1 redis-server --service-install --service-name redisService2 --port 10002 redis-server --service-start --service-name redisService2 redis-server --service-install --service-name redisService3 --port 10003 redis-server --service-start --service-name redisService3上述命令会在同一台机器上安装并启动三个独立的 Redis 服务实例redisService1、redisService2、redisService3分别监听 10001、10002、10003 端口。这是 Windows 版 Redis 支持服务命名的核心价值——多实例在端口、服务名、配置文件层面完全隔离。源码层面的几个细节Win32_service.cpp默认服务名为Redis#define DEFAULT_SERVICE_NAME Redis服务名最长 256 字符MAX_SERVICE_NAME_LENGTH超出会报错服务启动时BuildServiceRunArguments会把--service-name及其值从传递给 Redis 的参数中剥离第 655-658 行确保 Redis 核心逻辑只收到真实配置参数对应地config.c 第 586-588 行在 Windows 下会忽略service-name指令注释写明 “This is taken care of in the win32_service code”。3.7 服务命令与配置参数的关系小结下表汇总了 Win32_CommandLine.cpp 第 357-364 行中注册的全部服务相关参数及其语义参数取值语义--service-install无安装服务Autostart NetworkService 账户不启动服务--service-uninstall无从注册表移除服务定义不停止服务--service-start无启动已安装的服务--service-stop无停止服务--service-name服务名指定以上命令所操作的服务名多实例时必用--service-run无内部专用服务主进程实际运行入口安装时自动替换无需手工使用四、服务运行时的配置要点redis.windows-service.conf服务模式下 Redis 读取的是服务专用配置文件redis.windows-service.conf它与普通 redis.conf 的差异集中在 Windows 特有项上值得逐条对照4.1 Windows 特有的限制与设置配置文件头部注释明确说明On Windows, daemonize and pidfile are not supported. However, you can run redis as a Windows service, and specify a logfile. The logfile will contain the pid.即 Windows 版不支持daemonize与pidfile守护进程化由 Windows 服务模型替代日志文件中会包含 PID。4.2 事件日志Event Log自动启用服务模式下日志有两个出口文件日志与 Windows 事件日志。配置模板中的相关项logfile Logs/redis_log.txt syslog-enabled yes syslog-ident redislogfile文件日志路径建议使用相对安装目录的路径服务的工作目录会被固定到可执行文件所在目录见 4.4syslog-enabled yes把 POSIX 的 syslog 能力映射为 Windows 事件日志。配置注释明确说明如果 Redis 以 Windows 服务方式安装并启动事件日志会自动启用If Redis is installed and launched as a Windows Service, this will automatically be enabled.syslog-ident redis事件日志中的来源名称Source name服务安装时会注册对应的日志源。这一映射与 Redis on Windows.md 中 “Logging” 一节的说明一致POSIX 版通过 syslog 记录日志Windows 版对应物是 Event Log--syslogxxxx系列参数被映射到事件日志。因此服务启动失败时应优先查看“事件查看器 → Windows 日志 → 应用程序”其中以redis为来源的事件记录了服务初始化错误。4.3 内存映射堆与持久化相关注意项Windows 移植版用“内存映射文件 准 forkquasi-fork”机制模拟 POSIX 的fork()以实现 RDB/AOF 快照。运行时磁盘空间需求等于内存映射堆的大小默认取以下三者之一详见 Redis on Windows.md--maxheap参数指定的大小若提供否则为--maxmemory的 1.5 倍50% 余量用于应对堆碎片化否则为物理内存大小。配置模板中与之相关的 Windows 特有项# persistence-available [(yes)|no] maxmemory bytes若把persistence-available no将关闭所有持久化并禁用 BGSAVE / BGREWRITEAOF 等需要 fork 的命令config.c 第 589-622 行会从命令表删除bgsave、bgrewriteaof、replconf、psync、sync适用于纯缓存场景maxmemory需要注意Windows 版使用系统页面文件分配堆内存任务管理器中的 Working Set 不能准确反映 Redis 实际占用应以INFO命令的used_memory为准而used_memory_peak与任务管理器 Peak Working Set 的差值可推算进程额外开销。4.4 服务的工作目录与路径权限服务启动时Windows 默认工作目录是%systemdir%System32NetworkService账户通常没有权限在此创建内存映射文件。因此 Win32_service.cpp 的ServiceWorkerThread第 449 行起在调用main()前会把当前目录切换到 redis-server.exe 所在目录第 466-479 行并注释说明这是避免服务启动失败的修复。这也是为什么建议把logfile、dir等路径写成相对路径或显式指向有权限的绝对路径。4.5 服务配置模板中的常规项redis.windows-service.conf 其余部分与标准配置一致常用项包括port 6379 # 监听端口MSI 安装时可由 PORT 属性指定 tcp-backlog 511 # TCP 连接队列长度 timeout 0 # 空闲客户端超时0 为不关闭 tcp-keepalive 0 # TCP keepalive秒 loglevel notice # 日志级别debug/verbose/notice/warning databases 16 # 数据库数量 save 900 1 # RDB 快照规则900 秒内至少 1 次写 save 300 10 save 60 10000 appendonly no # 是否开启 AOF appendfsync everysec # AOF fsync 策略 requirepass foobared # 访问密码默认注释掉 maxmemory-policy noeviction # 内存淘汰策略五、服务账户与运维注意事项5.1 默认账户与自定义账户默认安装无论 MSI 还是--service-install都将服务配置为以NT AUTHORITY\NetworkService账户运行。原文档与 Redis on Windows.md 的 “Service Account” 一节都指出某些环境需要使用其他账户例如域服务账户此时需要手动通过服务管理器services.msc修改服务的登录身份若更换账户必须为该账户授予 redis-server.exe 所在目录的读写/创建权限。MSI 与--service-install流程会自动为NetworkService授权ServiceInstall中的SetAccessACLOnFolder但手工更换账户后这一授权不会自动发生。5.2 升级与卸载Redis Windows 版支持xcopy 部署直接把新二进制覆盖旧文件即可升级前提是服务未在运行卸载服务前若服务正在运行需先停止--service-uninstall只移除注册表服务定义。5.3 稳定性建议Redis on Windows.md 中的最佳实践提示由于 Redis 依赖系统交换空间页面文件与磁盘上的内存映射文件最稳定的配置是让 Redis 独占一台接近“干净安装”的系统避免第三方程序在运行时争抢交换空间导致内存映射堆分配失败。若堆碎片化严重导致--maxmemory的 50% 余量不够用应显式使用--maxheap扩大堆上限。六、服务命令调用顺序速查目标命令安装服务默认名 Redisredis-server --service-install redis.windows.conf --loglevel verbose安装并命名服务redis-server --service-install --service-name myRedis redis.windows.conf启动服务redis-server --service-start多实例时加--service-name停止服务redis-server --service-stop多实例时加--service-name卸载服务redis-server --service-uninstall多实例时加--service-nameMSI 静默安装自定义端口msiexec /quiet /i Redis-x64.msi PORT1234 ADD_FIREWALL_RULE1所有--service-*命令均需管理员权限UAC 提权由 Redis 自动完成安装后务必执行--service-start才能真正运行服务多实例部署时每个实例使用独立端口与独立服务名并可各自指定不同的配置文件与日志路径。延伸阅读服务命令的完整源码注释与实现Win32_service.cpp命令行参数注册表服务参数与 Redis 常规参数的分发Win32_CommandLine.cpp服务专用配置模板redis.windows-service.confWindows 移植的整体架构网络层、文件描述符、quasi-fork、事件日志、服务实现Redis on Windows.mdMSI 安装工程端口、防火墙、内存上限属性定义Product.wxs赞分享数据库KV存储缓存【免费下载链接】redisRedis 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项目地址https://gitcode.com/gh_mirrors/redi/redis点击查看免费下载相关推荐给AI助手立好代码规范GitHub Copilot for Xcode 自定义指令实战指南给AI助手立好代码规范GitHub Copilot for Xcode 自定义指令实战指南 AI 写的代码命名总是乱、错误处理总缺、架构风格总对不上返工一开发工具AI 应用AI AgentWindows 平台 Redis 服务化部署完全指南MSI 一键安装与 redis-server 服务命令详解Windows 平台 Redis 服务化部署完全指南MSI 一键安装与 redis server 服务命令详解 本文聚焦 Redis for Windows缓存KV存储数据库后端Redis多实例部署终极指南在单台Windows服务器上运行多个实例的完整教程Redis多实例部署终极指南在单台Windows服务器上运行多个实例的完整教程 Redis作为高性能的内存数据库在实际应用中经常需要在单台服务器上部署多个实数据库KV存储缓存上一篇SDL2 相对鼠标模式Relative Mouse Mode实测指南基于 lite 仓库捆绑 SDL2 的测试文档与源码解析下一篇终极免费方案Wand-Enhancer解锁WeMod高级功能的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →