ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows 安装 Redis 完整指南:从选版本到配置、服务注册与排障

Windows 安装 Redis 完整指南:从选版本到配置、服务注册与排障 先说个我自己的经历。早几年我第一次在 Windows 上装 Redis从同事那里拿了个压缩包双击redis-server.exe黑窗口一闪我以为没启动成功又双击了几次结果后台起了好几个 Redis 实例6379 端口全部被占满。后面排查了半天才搞明白每次双击都会拉起来一个独立进程而且它们都没有加载我预期中的配置文件。这个坑之所以典型是因为 Windows 版 Redis 的资料本来就乱版本也杂。有微软存档的 3.2 版有社区维护的 5.0、6.x 版还有现在的 7.x 构建版它们的默认配置、启动方式甚至部分命令行为都不一样。照着老教程操作很容易在莫名其妙的地方卡住。所以这篇不是简单把下载链接和两条命令贴给你而是想把我踩过坑之后走通的一条完整链路讲清楚选版本、解压启动、逐项改配置、注册成 Windows 服务、排查连接问题最后再告诉你装完之后必须做的验证动作。适合第一次在 Windows 上装 Redis 的开发者也适合那些已经能跑起来、但总觉得哪里不对劲打算重新梳理一遍的老手。1. 你得先选对版本Windows 版 Redis 不是同一个东西1.1 Windows 上能跑的 Redis 到底有哪几种先给结论Redis 官方并没有发布原生的 Windows 可执行程序这点和 MySQL、Nginx 不一样。目前你在 Windows 上能直接跑的 Redis基本来自三个途径第一类是早期微软维护的移植版版本停留在 3.2 左右。它非常稳定但功能很老后来的 Streams 数据结构、ACL 权限控制、Redis 6 之后的诸多特性它都没有。适合那种我只想本地简单缓存一下的场景但我不建议新项目再用它。第二类是社区持续维护的 Windows 构建版常见的有 5.0、6.0、7.x 系列。这也是现在最主流的选择。它的内核和 Linux 版保持同步功能基本一致配置文件也几乎通用区别在于个别默认值的取舍。日常开发、学习、内网部署选这个就没问题。第三类是干脆不用 Windows 原生二进制而是通过 WSL 2 或 Docker Desktop 跑 Linux 环境里的 Redis。这个方案在兼容性上最接近生产环境后面我会单独讲它什么时候更合适。1.2 版本差异会造成什么实际影响很多人觉得Redis 不都一样吗装哪个版本无所谓但真到配置阶段你会发现问题。以requirepass为例3.2 时代默认不校验密码而 6.0 之后引入了 ACL 体系虽然默认也允许免密访问本地回环地址但如果你把bind配置改成了0.0.0.0保护模式和密码要求会直接拦截远程连接行为差异很明显。再比如 RDB 持久化快照不同版本的默认save策略虽然都是900 秒 1 次、300 秒 10 次、60 秒 10000 次这一套但 7.x 的默认appendonly配置已经变成yes老版本默认是no。这是一个非常容易被人忽略的点你从旧教程里抄了appendonly no可能就把新版本本来默认开启的 AOF 持久化关掉了。安装方式版本范围推荐场景注意事项微软旧移植版3.2.x临时验证、老项目兼容功能陈旧无 ACL、无 Streams社区 Windows 构建版5.0 7.x日常开发、内网测试选 5.0 以上版本更稳妥WSL 2 / Docker 方式与 Linux 官方同步追求与生产环境一致需要额外配置子系统或容器1.3 先回答一个问题装在 Windows 上是为了什么在我给出任何具体步骤之前建议你先想清楚用途。如果只是本地起个缓存验证一下项目代码社区 Windows 构建版完全够用如果是为了跟同事统一环境版本那选一个固定的 6.x 或 7.x大家保持一致即可但如果你要模拟线上高并发或者做生产级部署我更推荐直接上 WSL 2 或 Docker而不是在 Windows 原生环境里硬扛。这个决定会影响后面的所有配置所以别跳过。2. 把服务拉起来第一次启动和最基本的连通性测试2.1 目录和解压步骤别出现空格别用系统盘拿到压缩包之后不要直接解压到桌面也不要放进C:\Program Files。原因是 Windows 路径里的空格和权限问题会引起很多奇怪的故障尤其是在注册服务或者加载配置文件时路径解析经常会出幺蛾子。我习惯放在D:\Redis这类不包含空格的目录下。解压完成后目录里应该能看到redis-server.exe、redis-cli.exe、redis.windows.conf、redis.windows-service.conf等文件。少数构建版本可能只有redis.conf不用纠结文件名找到那个.conf文件就行。顺便说一下我把 Redis 放在 D 盘还有个原因是日志和持久化文件也会写到该目录下系统盘权限控制严格容易碰到能启动但写不了 RDB 文件的隐患。2.2 用命令启动不要反复双击双击redis-server.exe不是不行但问题很多。第一你没有明确指定配置文件它可能加载默认配置也可能因为找不到配置而采用低配参数启动第二多双击几次就会启动多个进程第二次之后因为端口冲突大概率报错退出但这个报错一闪而过根本来不及看。正确做法是在当前目录打开一个命令行窗口执行redis-server.exe redis.windows.conf如果你用的是redis.windows.conf文件名就要写全如果目录里只有一个redis.conf就写redis.conf。启动后窗口里会出现 Redis 的 ASCII 标志和一堆监听日志包含port: 6379、PID等信息这就说明服务已经在运行了。注意这个黑窗口不能关关了进程就没了。每次开机想用 Redis 都要先打开终端跑一遍这是最朴素但也最容易理解的启动方式。2.3 第一个 PING 和第二轮数据验证服务启动后再另开一个命令行窗口进入 Redis 目录执行redis-cli.exe ping如果返回PONG说明 Redis 核心链路是通的。但只验证一个PING还不够我建议顺手把几个基础数据类型都测一遍这一步能同时确认安装包没有损坏、客户端和服务端版本匹配redis-cli.exe set user:1 admin redis-cli.exe get user:1 redis-cli.exe expire user:1 60 redis-cli.exe ttl user:1 redis-cli.exe hset order:100 status paid amount 299 redis-cli.exe hgetall order:100能看到admin和订单的哈希结构说明字符串和哈希都没问题。有精力可以再试LPUSH、SADD、ZADD一次把这些最基础的能力摸一遍后续写业务代码时就更有底了。2.4 用 shutdown 关闭而不是直接关窗口开发阶段你可能会直接按CtrlC或者关掉黑窗口来停服务这在临时环境问题不大但不是一个好习惯。Redis 的持久化需要进入退出流程才会把内存数据正确落盘强制终止可能留下不完整的 RDB 或 AOF 文件。正确做法是优雅关闭redis-cli.exe shutdown如果配置了密码需要带上认证信息比如redis-cli.exe -a yourpassword shutdown不过-a会把密码暴露在命令行历史里介意的话可以设置环境变量REDISCLI_AUTHyourpassword这样redis-cli会从环境变量里读取密码安全性好很多。这个习惯值得早点养成。3. 照工程习惯改配置这些参数不看会吃亏3.1 两个配置文件先分清忘改哪个Windows 构建版的压缩包里通常会有两个配置文件一个是redis.windows.conf一个是redis.windows-service.conf。名字很接近但用途不同。普通命令行启动时加载的是前者当你后面把 Redis 注册成 Windows 服务时服务默认加载的是后者。很多人踩的坑是改了redis.windows.conf然后启动服务发现配置完全不生效白白排查半天。如果你打算两种方式混用最省事的做法是把两个文件里涉及端口、密码、持久化的关键配置改成一致或者直接让其中一个文件通过include引入另一个文件的内容。我对新手的建议是先只专注改redis.windows.conf等跑通了再处理服务的事。3.2 网络开口bind、port 与 protected-mode配置文件的头部有一段网络配置最常见的修改范围是bind和port。port 6379是默认端口一般不改除非 6379 被其他程序占用了。如果被占用要同时改服务端配置和客户端工具里的端口参数很容易漏。bind决定了 Redis 监听哪些网卡地址。默认通常是127.0.0.1也就是只有本机能访问这对本地开发来说最安全。如果你需要让局域网里其他机器连过来可以绑定到你想要的内网 IP或者直接改成0.0.0.0表示监听所有网卡。这里有个容易被忽略的联动项protected-mode yes是保护模式。当它开启时如果 Redis 没有设置密码并且监听地址包含非回环地址它会拒绝来自外部 IP 的连接。所以只改bind 0.0.0.0不想着同步设置密码远程连接大概率会被拦下来而且日志里会明确提示是保护模式做的坏事。3.3 口令认证requirepass 不是可选项我不建议你开发环境裸奔至少要在配置文件里加一行requirepass yourpassword加完之后redis-cli连接时需要认证业务代码的客户端配置里也需要同步修改否则会报NOAUTH Authentication required。Redis 6 之后的版本还支持 ACL 用户体系把requirepass换成了更细粒度的用户和权限控制比如user default on nopass ~* all不过对一般项目来说requirepass足够简单、直接。千万别因为只是开发环境就留着空密码我见过不止一次内网 Redis 被扫描器打穿的事故。3.4 持久化RDB 与 AOF 的组合选择Redis 持久化默认开了 RDB 快照也就是定期把内存数据全量保存到磁盘。配置里类似这样的行save 900 1 save 300 10 save 60 10000 dbfilename dump.rdb dir ./意思是 900 秒内有 1 次写操作、300 秒内有 10 次写操作、60 秒内有 10000 次写操作时触发一次快照。这套策略下最坏情况下可能丢失最近十几分钟的数据。AOF 持久化则把每次写命令追加到日志文件恢复时通过重放命令来还原数据。关键配置项是appendonly yes appendfsync everysecappendfsync everysec表示每一秒同步一次 AOF 文件崩溃时最多丢一秒数据属于性能和可靠性的均衡选择。网络转载里经常看到官方已经默认打开 AOF的说法但这取决于版本最好是自己在config get appendonly里确认一下不要凭印象。如果你只是做缓存丢了数据也能接受那可以把save全部注解掉甚至设置save 避免写磁盘拖累性能还能减少 SSD 损耗。3.5 容量天花板maxmemory 与淘汰策略Redis 默认可以一直用内存直到系统扛不住这对生产环境是危险的。配置里我一般必加这两行maxmemory 256mb maxmemory-policy allkeys-lrumaxmemory是 Redis 能用的最大内存上限超过之后会根据淘汰策略清理键。allkeys-lru表示所有键都参与 LRU 淘汰优先移除最久未使用的数据适合最常见的缓存场景。如果你希望只淘汰设置了过期时间的键用volatile-lru也行。这里有一个很容易误解的点Redis 到了内存上限之后不会报错停机而是根据策略开始淘汰数据。很多刚接触的人发现为什么我的 key 少了第一反应是有人误删其实多半是触发了淘汰策略。通过info stats里的evicted_keys指标可以确认是否发生了淘汰。3.6 推荐配置汇总我把自己在 Windows 本机和内网测试环境常用的配置整理成一张表你可以直接对照着改配置项推荐值原因bind127.0.0.1需要远程再改减少无谓暴露protected-modeyes防止无密码时远程被连requirepass设置强密码基本防护maxmemory256mb或按需防止内存耗尽maxmemory-policyallkeys-lru缓存场景通用appendonlyyes降低崩溃丢数据风险appendfsynceverysec性能和数据安全平衡点改完配置记得重启服务然后用redis-cli.exe config get maxmemory这类命令确认变更已生效。4. 把 Redis 注册成 Windows 服务一整套命令与排障4.1 直接开窗口 vs 后台服务前文那种开黑窗口跑 Redis 的方式适合临时用不适合长期开发。你不可能每天到公司先手动打开终端再盯着一个黑窗口不放更不可能让同事都养成这种奇怪习惯。把 Redis 注册成 Windows 服务让它在后台自动运行、开机自启才算真正装好了。Windows 版的redis-server.exe内置了服务注册功能不需要额外装工具。这点设计得比不少软件贴心。4.2 安装、启动、停止、卸载服务命令用管理员身份打开命令提示符进入 Redis 目录执行安装命令redis-server.exe --service-install redis.windows-service.conf --service-name Redis参数说明--service-install表示安装服务后面跟的配置文件是服务模式加载的配置--service-name Redis是给服务起个名字可自定义。安装完成后启动服务redis-server.exe --service-start --service-name Redis查看服务运行状态sc query Redis更新配置后需要重启服务redis-server.exe --service-stop --service-name Redis redis-server.exe --service-start --service-name Redis卸载服务redis-server.exe --service-uninstall --service-name Redis整个流程不复杂但有一个前提命令提示符必须右键以管理员身份运行否则注册服务时会因为权限不足失败报错信息可能是Access is denied或者干脆没有明显输出但不成功。4.3 服务起不来的完整排查链路服务装好但启动失败是高频问题我这里给你一套排查顺序不用瞎猜。第一步用sc query Redis看服务状态如果显示STOPPED说明启动时直接退出了。第二步检查管理员权限确认安装和启动命令都是在管理员终端里执行的。第三步查端口占用netstat -ano | findstr 6379如果看到已有进程监听 6379说明之前残留了一个手动启动的 Redis 实例。先把它结束掉taskkill /F /PID 进程号第四步看日志。服务模式的日志如果没有指定logfile很可能写到 Windows 事件日志里或者直接输出到空。建议在服务对应的配置文件里提前设置logfile D:/Redis/redis.log这样启动失败时能直接看日志文件里的错误。第五步检查数据目录权限。如果dir指向了没有写权限的目录服务启动时可能连 RDB 文件都打不开表现就是服务秒退。解决方法是把dir指到 Redis 安装目录下或者给目标目录授予当前用户完全控制权限。4.4 如果必须用 Docker 或 WSL 里的 Redis 呢如果你的目标环境是 Linux 服务器或者你需要主从、集群、哨兵这些高级架构Windows 原生版体验并不好。这时我更推荐用 Docker Desktop 跑容器docker run -d --name redis -p 6379:6379 --restart unless-stopped redis:7.2这条命令会从镜像仓库拉取 Redis 7.2 镜像并启动一个容器宿主机的 6379 端口会映射到容器内部的 6379。优势很明显行为几乎和 Linux 产线一致配置文件也完全沿用官方样例。唯一要注意的是容器默认配置未必打开持久化如果希望数据保留需要挂载数据卷或用redis-server --appendonly yes覆盖启动命令。Windows 内嵌的 WSL 2 子系统也可以apt install redis-server直接装但 Windows 本地进程和 WSL 之间的网络互通偶尔会有小坑适合愿意折腾的人。5. 连接问题排查从本机连不上到跨机器被拒绝5.1 分清三种连不上我接手过很多人的排障需求他们只会丢一句Redis 连不上。实际上连不上至少分三种连接被拒绝、连接超时、认证失败对应的原因完全不同。本机连接被拒绝通常是服务没起来或者端口不对用redis-cli.exe ping测就能复现。连接超时大概率是防火墙或网络层问题比如 Windows 防火墙拦了入站端口或者云服务器安全组没有放行 6379。认证失败则是提示WRONGPASS或NOAUTH说明密码配置不对。把问题归类是第一位的别一上来就查防火墙、改绑定。5.2 远程访问被拒bind、防火墙、认证三层排查局域网内另一台机器连不上你的 Redis按顺序查第一层确认 Redis 监听的地址是不是包含对方机器能访问到的网卡。如果bind还是127.0.0.1外部机器当然连不上因为 Redis 根本没在局域网网卡上监听外网程序自然找不到。可以把bind改成具体的内网 IP或者干脆0.0.0.0。第二层确认protected-mode。如果它还是yes并且没设密码Redis 会拒绝非本机连接。给requirepass配上密码或者看具体报错再决定是否关闭保护模式。第三层确认 Windows 防火墙入站规则放行了 TCP 6379。可以用这样的命令添加规则netsh advfirewall firewall add rule nameRedis 6379 dirin actionallow protocolTCP localport6379如果服务器在云上别忘了安全组里也要放行这个端口这一步很多人会漏。5.3 磁盘权限和持久化报错Windows 上跑 Redis 还有一个特有坑服务账号对数据目录没有写权限时日志里会反复出现类似Failed opening the RDB file dump.rdb for saving: Permission denied的报错。这个报错不会直接说服务挂了它只是每次持久化失败后继续运行数据却静默丢失。尤其是你把服务装在Program Files下或者把dir指到了受保护目录最容易触发。解决办法把dir配置指到一个普通数据目录比如D:\RedisData然后给该目录授予运行 Redis 的 Windows 账号完全控制权限。改完重启服务再看info persistence里rdb_last_successful_save是否变成 1 秒前的时间。5.4 端口占用和残留实例还有一个隐蔽问题同一个服务器上跑多个 Redis 实例时你忘记改第二个实例的端口或者卸载服务时没关干净就会发生明明是刚装好的服务为什么端口被占用的诡异现象。排查命令还是netstat -ano | findstr 6379找到 PID 后在任务管理器里确认进程路径。如果路径指向的正是你的 Redis 安装目录那基本可以断定是残留实例。用redis-cli.exe shutdown优雅关闭它或者taskkill /F /PID强制结束再启动服务。6. 装完不算完我会立刻做的三个验证动作6.1 重启一遍验证数据是否按你的配置落盘配置改完、服务注册好之后别急着写业务代码。我做的第一件事是故意重启一次 Redis测试持久化是否可靠。操作很简单先写几个 key然后执行redis-cli.exe shutdown正常关闭再启动 Redis看这些 key 还在不在。如果appendonly yes生效重启后数据应该完整如果只靠默认 RDB 快照只要写的 key 没达到触发条件重启后丢数据是正常的。这个测试能帮你真实感受当前配置的可靠性而不是停留在我好像开了持久化的印象里。6.2 压一遍淘汰策略确认不会莫名其妙丢数据如果你配置了maxmemory和淘汰策略我建议你也造一点数据测试。把maxmemory临时调小比如10mb然后用循环写一批带EX过期时间的数据观察info stats里的evicted_keys。这个验证的意义在于它能让你提前认识到Redis 到了内存上限会静默淘汰数据业务代码里如果没做好缓存缺失的回源处理会出现大量缓存穿透。所谓缓存治理不是事后补救而是在配置阶段就要明白淘汰策略的影响。6.3 记录基线信息info 命令是你的体检报告最后我习惯在装完 Redis 后执行几条info命令把关键指标记录下来作为后续排障的基线redis-cli.exe info server redis-cli.exe info memory redis-cli.exe info persistence redis-cli.exe info stats重点关注redis_version、used_memory、rdb_last_successful_save、total_connections_received这些字段。将来服务异常时能通过对比基线和当前数据快速判断是内存增长过猛、连接数异常还是持久化失败。这个过程花不了一分钟但能帮你省下很多排查时间。我个人目前的做法是本地开发用社区 Windows 构建版配置按上面这张表来凡是需要跟线上行为对齐的环境一律用 Docker 容器。Windows 原生版不是不能用但只有把它当作一个开发环境里的便利工具来对待配置边界清楚才能少踩一些不影响业务却能折腾你一下午的坑。
返回列表