尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Windows安装Redis 7:WSL与Docker双方案实操指南

Windows安装Redis 7:WSL与Docker双方案实操指南 搜了半小时“redis7 for windows的安装教程”你会发现一个残酷的事实Redis官网根本没有Windows安装包。官方下载页上只有Linux、macOS这些平台的源码包和安装说明Windows那一栏永远是空的。这不是官网偷懒而是Redis官方从3.0版本起就明确不维护Windows分支之后的迭代——包括Redis 7的Redis Functions、sharded pub/sub、listpack编码等新特性——全部围绕Linux生态开发。我第一次在Windows上装Redis 7时也踩了不少坑。网上教程各说各话有的让去WSL里装有的让用Docker拉镜像还有的甩给你一个来源不明的zip压缩包声称是“Redis 7 Windows版”。我把这些路子都试了一遍折腾了小半天才理清楚什么场景该走哪条路、每个方案会卡在什么环节、装完之后的配置有哪些坑。这篇文章就把整个过程和关键细节写出来给正要动手装Redis 7的朋友做个完整参考。先说核心结论在Windows上跑Redis 7当前主流方案只有两条——WSLWindows的Linux子系统和Docker。如果你的目的是本地开发、学习Redis 7的新特性或者希望本地行为和生产环境的Linux机器完全一致推荐WSL如果你已经依赖Docker管理中间件想要快速起停、多实例隔离那就用Docker。另外还有一个“伪方案”——Windows原生移植版它确实能在Windows上直接双击运行但版本停留在5.x和标题里要的Redis 7不是一回事后面我会专门讲清楚。1. 为什么官方不出Windows版先搞懂Redis的底层逻辑1.1 不是官方懒而是Redis太依赖Linux特性Redis之所以在Linux上性能极佳是因为它深度依赖了几个Linux特有的机制fork()系统调用用于RDB持久化和后台AOF重写、epoll事件循环处理高并发网络IO、以及一整套POSIX信号语义。Windows的内核模型和Linux完全不同没有fork()网络模型也更接近IOCP而非epoll。真要移植底层网络层和进程模型几乎要重写一遍。Redis的作者在社区里明确表达过态度维护Windows分支的代价太高而收益又很小因为生产环境99%都是Linux服务器。所以官方在3.0之后完全放弃Windows支持这也解释了为什么你搜遍官网也找不到任何Windows相关的安装包。理解了这一点再看到网上那些“Redis 7 for Windows”你心里就有数了——要么是社区的Windows移植版要么就是WSL/Docker安装教程。1.2 社区原生移植版的真面目能用但不是Redis 7这里有个非常容易踩的坑。GitHub上有一个很出名的项目tporadowski/redis提供了能在Windows上直接运行的redis-server.exe很多教程都拿它当“Windows版Redis”推荐。但它的版本号停留在5.0.14.1是基于Redis 5.0改的不是Redis 7。如果你的需求只是“一个缓存服务”解压即跑确实方便但如果你要用Redis 7的ACL增强、Redis Functions、sharded pub/sub这些能力它一样都没有。市面上也存在一些社区成员用MSYS2/MingW环境自行编译的Redis 7 Windows二进制但这类东西的稳定性、依赖完整性都没有任何保障我不建议在需要长期使用的环境里碰。真要追求Redis 7的完整能力老老实实走WSL或Docker才是正路。2. 三条路线怎么选WSL、Docker、原生移植版的取舍选路线之前要对自己的需求有个清醒判断。这里直接给一个对比表方便你一眼定位方案是否Redis 7接近生产环境程度安装难度适合场景WSL redis-server是极高就是Linux环境中等需装WSL认真学习Redis 7本地行为和服务器一致Docker redis:7镜像是高官方镜像低装Docker Desktop即可已依赖Docker需快速起停、多实例隔离Windows原生移植版否5.x低极低解压即用临时测个缓存逻辑不想装任何环境2.1 WSL行为最接近生产环境的路线WSLWindows Subsystem for Linux的本质是在Windows里跑一个真正的Linux发行版然后在这个发行版里安装Redis。因为Redis在Linux上的跑法和生产环境完全一致你在WSL里踩过的坑、验证过的配置直接搬到服务器上不会有任何偏差。代价是需要先装WSL和一套Ubuntu镜像第一次配置大约十几分钟期间还可能遇到系统版本和虚拟化相关的兼容问题。但这是一次性投入之后的收益是长期且可转移的。2.2 Docker起停最快、环境最独立如果你已经是Docker Desktop的日常用户那Redis 7就只是两条命令的事。Docker方案的好处是环境由镜像固化宿主Windows系统是什么样的都不会影响容器里的Redis行为坏处是Docker Desktop本身比较吃内存如果电脑配置一般为了跑个Redis单独开一个虚拟机级别的Docker环境有点不划算。我的判断标准很简单平时开发已经离不开Docker的直接用Docker只是单纯想装Redis的优先WSL。2.3 原生移植版最后的备选项原生移植版唯一的优势就是方便。有些场景是这样的你只是想快速验证一段缓存逻辑是否work不想动系统配置不想装任何额外环境那解压一个redis-server.exe跑起来确实省事。但你要记住它不是Redis 7而且网上很多号称Redis 7的Windows压缩包来源不明我甚至见过夹带不明DLL的版本这种风险没必要去冒。只要有一点认真用Redis的心思我都不推荐拿它当主力。3. WSL路线实操在Windows里装一个真正的Redis 73.1 先把WSL环境准备好准备工作分三步管理员身份打开PowerShell执行wsl --install较新的Windows 10/11会自动安装WSL 2和默认的Ubuntu发行版接着重启电脑重启后首次启动Ubuntu会提示创建Linux用户名和密码注意这个用户名和Windows用户名无关密码后面用sudo经常要输别设得太随意。进系统后的第一件事是更新软件源sudo apt update sudo apt upgrade -y有老版本Windows的读者可能会碰上wsl --install报错通常的原因是系统版本太老或BIOS虚拟化没开启。排查路径是这样先重启进BIOS确认VT-x/AMD-V虚拟化已启用然后在“启用或关闭Windows功能”里勾上“适用于Linux的Windows子系统”和“虚拟机平台”最后执行wsl --update把内核组件补齐。3.2 安装Redis 7用官方PPA而不是默认源这里有个很多人会踩的坑Ubuntu默认软件源里的redis-server版本很可能不是7.x。比如Ubuntu 22.04默认带的是Redis 6.0.x直接apt install redis-server装完才发现版本不对还得折腾升级。想稳定拿Redis 7推荐添加Redis团队维护的官方PPAsudo add-apt-repository ppa:redislabs/redis sudo apt update sudo apt install redis-server装完验证一下版本redis-server --version正常输出会包含v7.x.x的字样。如果对版本号没有执念业务上6.x也够用那默认源直接装也行但既然目标明确是Redis 7一步到位比事后升级省心太多。3.3 启动Redis并注册开机自启WSL里启动Redis有个特殊性它的systemd不一定可用。较新的WSL 2默认已开启systemd所以可以这样启动sudo systemctl enable --now redis-server如果执行后报错提示System has not been booted with systemd as init system (PID 1). Cant operate.说明当前WSL发行版没有启用systemd。这时候别慌改用SysV风格的服务命令sudo service redis-server start实测下来service redis-server start在老版本WSL环境里非常可靠不依赖systemd就能把Redis拉起来。服务启动后用redis-cli ping验证返回PONG就说明一切正常。3.4 Windows侧如何访问WSL里的RedisWSL 2有一个非常方便的特性Windows可以通过localhost直接访问WSL里监听的端口。也就是说你在Windows本地的客户端比如Another Redis Desktop Manager或者直接下载一个Windows版的redis-cli连接127.0.0.1:6379就能连上WSL里的Redis。但有个前提WSL里的Redis监听地址得是0.0.0.0或::不能只锁死在回环地址上。默认配置通常没问题如果你改过bind导致Windows侧连不上排查顺序是先确认WSL里redis-cli ping通不通再去编辑/etc/redis/redis.conf把bind改成0.0.0.0重启服务。还有一个关键提醒WSL 2的IP地址每次重启都会变千万不要在Windows的连接配置里写死WSL的IP统一用localhost或127.0.0.1是最稳的。4. Docker路线实操一条命令拉起官方redis:7镜像4.1 拉取镜像、创建容器、验证连通Docker Desktop安装完成后确认引擎正常直接执行docker pull redis:7 docker run --name redis7 -p 6379:6379 -d redis:7第一条命令拉取官方Redis 7镜像第二条命令创建并启动名为redis7的容器把容器内6379端口映射到Windows本机的6379端口。验证方式docker exec -it redis7 redis-cli ping返回PONG说明容器内的Redis已经在正常服务。这里提醒一点redis:7标签会跟随7.x的最新小版本更新如果想锁定具体版本用redis:7.2或者redis:7.2.4这类更精确的标签避免哪天升级后行为变了影响你的调试。4.2 加密码和持久化这两步一定别省默认启动的redis:7容器是没有密码的。如果6379端口只在本机监听风险还小一些但一旦映射到内网被扫描器扫到无密码Redis基本等于给攻击者送数据。强烈建议启动时就用命令行参数指定密码和持久化docker run --name redis7 -p 6379:6379 -d redis:7 redis-server --requirepass yourstrongpassword --appendonly yes--requirepass设置访问密码--appendonly yes开启AOF持久化。但这样还不行容器一旦被删除容器内的数据就跟着没了。正经使用场景必须挂载数据卷docker run --name redis7 -p 6379:6379 -v redis7data:/data -d redis:7 redis-server --requirepass yourstrongpassword --appendonly yes执行后Redis的AOF文件会落到Docker命名卷redis7data里之后即使容器重建数据也还在。这里有个小细节挂载了数据卷后Redis启动时会从这个目录恢复数据所以--appendonly yes和-v要放在同一条命令里顺序无所谓但少了哪一个都会让持久化效果打折。4.3 多实例管理的小技巧Docker方案的一个明显优势是多套Redis环境之间可以做到完全隔离。我在做测试时经常需要同时跑几套不同配置的Redis做法是复制几条docker run命令只改容器名和端口映射docker run --name redis7-a -p 6380:6379 -d redis:7 docker run --name redis7-b -p 6381:6379 -d redis:7每套实例各占一个端口互不干扰用完直接docker rm -f清理不会在Windows系统里留下一堆残留进程。这个体验是Windows原生版比不了的。5. 装完别急着用redis.conf里这几个配置必须看明白5.1 bind、protected-mode和requirepass的组合逻辑Redis默认只监听127.0.0.1并且开启protected-mode。这两个配置加在一起的效果是只有本机能连外网一律拒绝。如果只是本地开发保持默认就可以但如果用了Docker端口映射或者想从局域网其他机器访问就得改配置并且强烈建议同时设置密码bind 0.0.0.0 protected-mode yes requirepass yourstrongpassword这里有一个很多人误解的点protected-mode yes不会阻止本机密码验证后的访问它的真正作用是——当Redis处于“无密码且被外部访问”的状态时直接拒绝连接。所以只要设置了requirepassprotected-mode保持yes才是更安全的做法。网上有些教程上来就让人把protected-mode改成no这是典型反面教材等于把自己家的大门敞开了。5.2 持久化RDB和AOF的取舍Redis 7的持久化机制和之前版本基本一致RDB是定时快照适合缓存场景AOF是追加日志数据更完整。默认配置下RDB是开着的满足触发条件时把全量数据写入dump.rdbAOF默认关闭需要用配置或启动参数显式开启。根据我的经验判断标准很简单数据丢了还能重新生成的开RDB就够了数据不能丢的开AOF并把appendfsync设为everysec兼顾性能和数据安全。两者也可以同时开Redis重启时默认优先用AOF恢复数据因为AOF日志记录更完整。常见误区是以为开了AOF就不需要RDB了实际上AOF文件体积会越来越大配合RDB做定期瘦身反而是生产环境的常见做法。5.3 maxmemory与内存淘汰策略先说的是生产环境里铜墙铁壁般的基础配置。如果不设置maxmemoryRedis会无限使用内存直到把整台机器拖垮。常用配置maxmemory 1gb maxmemory-policy allkeys-lrumaxmemory是内存上限maxmemory-policy是达到上限后的淘汰策略。allkeys-lru对所有键按最近最少使用原则淘汰适合缓存场景volatile-lru只淘汰设置了过期时间的键适合有永久键和临时键混合的业务。Redis 7还支持allkeys-lfu这类按访问频率淘汰的策略但初期拿不准就先用allkeys-lru大多数场景不会出大错。5.4 daemonize和logfileWindows环境下的特殊注意点daemonize yes在Linux里是让Redis后台运行但在Windows原生移植版里通常不生效甚至会导致进程行为异常。所以在Windows上跑移植版要么让redis-server在前台跑要么用redis-server --service-install注册成Windows服务。很多人遇到的“exe双击后闪退”就是这么来的——不是Redis坏了而是它以不适合Windows的方式被启动了。在WSL和Docker方案里则不需要操心这个问题进程管理交给systemd或容器编排就行不要在配置文件里手动开daemonize。还有logfile这个配置Windows原生版如果设置了相对路径日志文件可能落在你意想不到的目录导致排查问题时找不到日志。建议在Windows里总是用绝对路径或者干脆让日志输出到控制台保持前台运行观察起来最直观。6. 实测最容易翻车的五个场景与排查思路6.1 WSL里systemd报错不是Redis的问题症状是执行sudo systemctl start redis-server后报System has not been booted with systemd as init system (PID 1). Cant operate.。原因在前面提过WSL发行版没有把systemd作为1号进程。解决方法有二一是改用sudo service redis-server start这是SysV启动方式老版本WSL里很管用二是编辑/etc/wsl.conf加入[boot] systemdtrue然后在Windows终端执行wsl --shutdown重新进入WSL后systemctl即可正常使用。注意改完wsl.conf后一定要wsl --shutdown重启整个WSL环境光在Ubuntu里reboot是没用的。6.2 Windows防火墙拦了6379端口Docker方案中-p 6379:6379会在Windows上开一个监听端口第一次启动时系统通常会弹防火墙授权窗口。如果当时点了取消或者窗口根本没弹出来你会发现自己本机的客户端都连不上但容器里docker exec却又一切正常。排查方法很直接执行netstat -ano | findstr 6379确认端口在LISTENING状态再看Windows Defender防火墙里有没有相关规则。没有的话手动添加入站规则放行TCP 6379。放行之前务必确认Redis已经设置了密码这个顺序不能反。6.3 Windows原生版闪退用二分法定位问题如果还是绕不开想用Windows原生移植版双击redis-server.exe redis.windows.conf后窗口一闪而过先不要认为Redis坏了。最可能的原因有两个一是配置文件的路径不对exe没在同目录下找到conf文件二是conf里某个配置项在移植版里不被支持。排查办法是先不带任何参数运行redis-server.exe让它走默认配置如果这时能正常启动说明问题出在conf文件上。接下来把conf内容逐段加回去启动时报错就能定位到具体配置项。这个方法我用了很多年比瞎猜高效得多。6.4 ACL配置失误Redis 7用户系统更严格Redis 7把ACL能力做得更精细了也意味着更容易配置出错。一个典型的翻车场景在redis.conf里给default用户设置了密码user default on yourpassword结果密码填错一位后面所有redis-cli连接都被拒绝第一反应以为是Redis挂了一顿重启操作后依然连不上。碰到这种问题先看Redis日志文件确认错误是WRONGPASS还是NOAUTH——前者是密码不对后者是没登录确认清楚再改配置别盲目重启。很多“Redis突然连不上”的故障本质都是ACL或密码配置导致的排查时方向要对。6.5 连接后如何确认版本和运行状态最后分享一个实用技巧判断连上的Redis是否真的是7.x执行redis-cli info server | grep redis_version或者连接后执行info server看redis_version字段。这个习惯我一直在用因为Redis 7.x内部的小版本差异挺明显比如7.2对一些命令的ACL默认值做了调整别用6.x时代的旧经验硬套新版本的行为。确认版本的同时还可以顺手看一眼uptime_in_seconds和connected_clients能帮你快速判断服务刚起还是已经跑了一阵。7. 我的最终选择和几点补充建议整套方案都跑完之后我在Windows上的推荐顺序是这样的日常开发就用Docker因为我已经装了Docker Desktop多一个redis:7容器毫无负担如果要认真研究Redis 7的深层特性——Redis Functions的脚本管理、sharded pub/sub的跨节点通信、listpack对小对象的编码优化——我会切到WSL里操作原因很简单生产环境是LinuxWSL里看到的行为才是真实可信的。另外想提醒刚开始接触Redis 7的朋友装完环境后的第一件事不是急着写业务代码而是先验证两件事第一Windows侧的客户端能不能正常连通服务端口第二密码和ACL配置是否如预期生效。用redis-cli ping配合-a参数做一次完整验证能帮你省掉后面大量排查时间。这两个检查我每一次都会做包括在服务器上部署时也一样算是一种肌肉记忆了。Redis 7在Windows上没有“官方一键安装包”这件事短期之内大概率不会改变。既然改变不了环境就把WSL或者Docker用熟练。这两种方式给你带来的收益其实远不止“能跑Redis 7”这么简单——你等于在Windows上获得了一个完整、可控、接近生产的Linux运行环境以后再装其他中间件比如MySQL、Nginx、RabbitMQ都是完全相同的套路。这条技能曲线非常值得花时间爬一次。
返回列表