ARTICLE DETAIL

资讯详情

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

Redis 7 在 Windows 上的三种安装方式:原生版、WSL2 与 Docker 实战

Redis 7 在 Windows 上的三种安装方式:原生版、WSL2 与 Docker 实战 先交代一下背景我最近在帮几个同事和学员配 Redis 7 的开发环境发现绝大多数人卡住的地方不是 Redis 本身的用法而是“Windows 上到底怎么装、装哪个版本、用哪种方式”搜出来的资料要么是老古董的 2.x 第三方移植版要么直接告诉你“Windows 不支持请用 Linux”。废话我在 Windows 上写代码我就要在 Windows 上先把服务跑起来调试怎么了于是我把这一周踩过的坑、验证过的方案整理成这份教程不只告诉你命令怎么写还会说明每个选择背后的原因以及哪些做法会在明天上班时坑你。这篇文章适合这几类读者想在 Windows 本地快速跑 Redis 7 做开发的程序员要做 CI/测试环境的人以及刚把项目 Redis 版本从 6 升级到 7、被配置项变化搞懵的运维或全栈同学。我会用实测过的三种路线逐一拆解——原生 Windows 移植版、WSL2 里的官方 Linux 版、Docker Desktop 容器版——并给出一套从下载、配置、服务化到停止卸载的完整闭环。1. 折腾之前Redis 7 在 Windows 上的真实情况1.1 Redis 7 到底带来了什么值得换吗Redis 7 是 2022 年发布的大版本和 6.x 相比最核心的变化有这么几个引入 Redis Functions用 Lua 写服务端函数取代部分 EVAL 脚本的繁琐管理、AOF 重写支持增量复制重写期间不阻塞主服务、命令执行耗时统计LATENCY命令更细粒度了、以及 List / Set / ZSet 等集合类型的底层编码优化。对于普通业务开发者而言实际直觉上的差异是批量写入小 value 时内存和 CPU 占用比 6.x 更友好使用WAITAOF命令时可以更精细地控制“主从同步 落盘确认”的持久化语义。但这些都不是必须升级的理由。真正促使我换 7 的原因很简单——项目里用的客户端库比如 Lettuce、StackExchange.Redis 和 go-redis 的新版本已经在针对 Redis 7 的 RESP3 协议做默认适配旧版 6.x 跑 RESP3 时总有某些命令行为不一致。所以你要是新起项目不如直接上 7免得别人问起来还得解释“为什么不上 7”。1.2 Windows 没有官方原生版别被老博客误导了提到 Windows 版 Redis网上大量旧帖子还在推荐 MicrosoftArchive 上那个 2016 年前后停更的 3.x 移植版连 5.0 都够呛更别说 7。实际上 Redis 官方确实没有提供“官方签名的 Windows 原生二进制”但社区有维护得不错的分支最常用的是 tporadowski/redis 这个 GitHub 仓库它能跟上官方主版本支持到 Redis 7.x对应包里带了 redis-server.exe、redis-cli.exe、redis-check-aof.exe、redis-check-rdb.exe 和 redis-benchmark.exe。它不是官方但日常开发调试完全够用。除原生移植版外还有两条主流路径WSL2 安装官方 Linux 版 Redis 7以及用 Docker Desktop 跑 redis:7 容器。我在本文中会用同一台 Windows 11 笔记本把三条路都完整走一遍并把每种方案的优劣势放在一个表里方便你按团队情况选。方案稳定性与生产环境一致程度部署速度适合场景原生 Windows 移植版中高低最快本地快速调试、单机缓存WSL2 官方版高高中贴近 Linux 生产、调配置文件Docker Desktop 容器版高中高中需要同时管理多个中间件、CI 模拟2. 快速跑通原生 Windows 移植版安装实战2.1 下载时要留意的细节打开 GitHub 上 tporadowski/redis 的 releases 页面找 Redis-x64-7.x.zip 这个包版本号以仓库最新 release 为准。我以 7.0.8 为例做演示但操作流程对仓库里所有 7.x 保持一致。这里有两个容易踩坑的地方不要下载 source code 压缩包那是给 Linux 编译用的Windows 小白解压后根本找不到 exe。选择下载源时尽量用浏览器直连或靠谱镜像GitHub 的 release 资产有时因网络原因会下到 0 字节文件解压时才会发现 crc 报错。解压后放到一个路径稳定的目录比如C:\redis7不要放在C:\Users\你的名字\Downloads下面就算完事因为后续要注册成服务或写定时任务时路径里的空格和用户名会造成奇怪的权限问题。把整个目录结构看一眼正常情况应该包含C:\redis7 ├── redis-server.exe ├── redis-cli.exe ├── redis-benchmark.exe ├── redis-check-rdb.exe ├── redis-check-aof.exe ├── redis.windows.conf ├── redis.windows-service.conf └── sentinel.conf (部分版本有)与 Linux 版的文件结构相比它保留了redis.windows.conf和redis.windows-service.conf两个模板配置文件这个区分在里面有讲究前者给前台启动用后者专门给注册 Windows 服务时用。2.2 第一次启动不用改任何配置也能跑在C:\redis7目录下按住 Shift 加右键选择“在此处打开 PowerShell 窗口”或直接 cmd执行.\redis-server.exe正常情况会看到 ASCII 艺术 Logo 和一行监听信息* Ready to accept connections tcp这时另开一个 PowerShell执行.\redis-cli.exe ping会返回PONG说明服务已经活了。这么做是为了先确认程序本身在 Windows 上可运行再逐步加配置。我见过有人一上来就改requirepass、改bind结果启动报错都不知道是自己配置文件写坏了。注意一个小点默认配置下 Redis 监听 6379且只允许本机回环地址访问127.0.0.1。这其实是安全默认项别急着改除非你明确知道要做局域网共享。如果窗口直接一闪而过大概率是redis.windows.conf里打开了 daemonize 或 logfile 指向了一个不存在的路径把那些临时改动先还原再说。2.3 前台启动的局限性前台启动只适合验证环境不适合日常开发因为 PowerShell 窗口一关Redis 就停了而且窗口里还会滚动大量日志干扰你敲其他命令。后面第 4 节我会讲怎么把它变成 Windows 服务但这之前你需要先理解配置文件里几个关键项。3. 配置文件 redis.conf 的必改项与为什么3.1 保护模式、绑定网卡和密码的三角关系Redis 的默认配置在安全上很讲究但对 Windows 本地开发又设置了不大不小的门槛。你用记事本或 VS Code 打开redis.windows.conf重点看三处bind 127.0.0.1 protected-mode yes # requirepass foobared这三者的关系可以这么理解bind规定了 Redis 监听哪些网卡的 IPprotected-mode是兜底保护——如果 Redis 在没有显式密码且没有绑定限制的情况下被公网 IP 访问到它会拒绝执行命令requirepass则是真正的访问密码。一个非常典型的坑是你在局域网另一台机器上要连这台 Windows 的 Redis一上来就改bind 0.0.0.0却不设置密码结果本机能连、远程死活连不上报错DENIED Redis is running in protected mode。这不是 Redis 坏了是保护模式在工作。我的建议很明确开发环境也要养成设密码的习惯。把requirepass那一行的注释去掉改成强一点的密码例如requirepass Str0ng!Passw0rd bind 0.0.0.0 protected-mode no然后重启 redis-server。重启后所有客户端都要带密码访问包括redis-cliredis-cli.exe -a Str0ng!Passw0rd ping我不想看到有人图省事注释掉密码后面被扫到端口然后被告警“敏感端口暴露”那真的得不偿失。特别强调bind 0.0.0.0和protected-mode no必须一起配合密码出现不然就是把数据裸奔在网络上。3.2 持久化到底要不要开RDB 与 AOF很多人以为 Windows 上的 Redis 就是内存缓存关机就丢无所谓。但如果你的项目里把 Redis 当“可断点续传的队列”或存了登录态那持久化就得开。Redis 7 提供两种持久化机制RDB快照按时间间隔把内存数据全量写入 dump.rdb恢复快、文件小但两次快照之间的数据会丢。AOF追加日志把每次写命令追加到 appendonly.aof数据更安全但文件大、重放慢。打开配置文件把这三个值确认留成如下形态save 900 1 save 300 10 save 60 10000 appendonly no我个人的建议是开发环境可开 RDB 就够了appendonly保持 no生产环境再按业务容忍度考虑 AOF。如果你要两套都开Redis 7 里要注意aof-use-rdb-preamble这个参数它默认 yes意味着 AOF 文件前段会用 RDB 格式做“混合持久化”这是 7.x 相对旧版的优化别看到 AOF 文件不是纯文本就觉得坏了。3.3 内存上限Windows 上最容易忽略的炸弹Redis 默认不限制内存直到 Windows 物理内存耗尽才由操作系统开始杀进程。这在开发机上后果不明显但如果你跑着 Docker、IDE、浏览器一堆东西时Redis 会悄悄把内存吃满系统卡成 PPT。建议至少在配置里加上maxmemory 512mb maxmemory-policy allkeys-lru512mb按你的开发机内存调整allkeys-lru是“内存满时优先淘汰最近最少使用的 key”适合通用缓存场景。若你的业务里有些 key 绝不允许被淘汰比如分布式锁那就改用volatile-lru代表只淘汰设置了过期时间的 key。设置maxmemory之后可以用redis-cli.exe info memory查看used_memory_human等字段验证是否生效。不会看也没关系下面第 7 节我会展示几条常用验证命令。4. 把 Redis 变成 Windows 服务像安装 MySQL 一样省心4.1 使用自带的 service 注册命令原生 Windows 移植版内置了 Windows 服务注册功能不用额外工具。以管理员身份打开 PowerShell切换到C:\redis7后执行.\redis-server.exe --service-install .\redis.windows-service.conf --service-name Redis7没有报错的话再执行.\redis-server.exe --service-start --service-name Redis7然后到服务管理器里看一眼确认状态变成“正在运行”。这条命令会把 Redis 封装成“Redis7”这个服务默认开机自动启动。日志输出不再直接打在控制台而是按配置文件里的logfile设置写到文件建议在redis.windows-service.conf里把日志路径改到固定位置logfile C:/redis7/logs/redis.log注意 logfile 所在目录必须先创建好否则服务启动时会因为打不开日志文件而失败。Windows 服务不会像前台启动那样在窗口里给你看错误信息排查时要靠事件查看器、或者看 redis 自己的日志文件。4.2 常用服务管理命令汇总我在日常调试里会用到下面这些命令给自己做个速查同时也贴给你# 启动服务 .\redis-server.exe --service-start --service-name Redis7 # 停止服务 .\redis-server.exe --service-stop --service-name Redis7 # 卸载服务 .\redis-server.exe --service-uninstall --service-name Redis7 # 查看当前 Redis 进程和端口占用 netstat -ano | findstr 6379 tasklist | findstr redis卸载服务前先停止再卸载否则服务文件被占用会报“服务正在运行”或“拒绝访问”。我踩过一次坑服务卸载失败后重启电脑才能删掉旧 exe所以别偷懒一定要先--service-stop再--service-uninstall。4.3 服务模式的两个隐藏特点服务模式下 Redis 不会读取你原来前台启动用的redis.windows.conf而是读服务装的redis.windows-service.conf。如果你改了配置文件但重启服务后没生效先确认改对文件没。Windows 服务重启后工作目录是C:\Windows\System32如果配置里用了相对路径会出现找不到 dump.rdb 或日志文件的问题。所以所有路径都写绝对路径这个习惯从第一天就养成。服务模式启动完全脱离了用户登录会话好处是电脑重启后不需要手动开窗口坏处是排查问题不直观。我的习惯是先前台启动确认配置没问题再注册成服务调试复杂问题时就先停服务、前台启动看全量日志定位完再切回服务。5. 更贴近生产WSL2 里的官方 Redis 75.1 WSL2 环境准备与注意点如果原生移植版让你觉得“不是官方的东西不放心”那就走 WSL2。Redis 官方文档只支持 Linux 和 macOSWSL2 能提供完整的 Linux 内核所以 WSL2 里的 Redis 7 就是官方版和 Linux 服务器一致。在 Windows 11 上管理员 PowerShell 执行wsl --install它会默认安装 Ubuntu并启用 WSL2。装完重启后进入 Ubuntu 终端。这里有个常见坑Windows Defender 防火墙会拦 WSL 里的网络访问但首次安装时 Windows 又会弹一个“允许 WSL 网络访问”的授权框别手快点了取消否则后面 Windows 程序连不上 WSL 里的 Redis。Ubuntu 内执行sudo apt update sudo apt install redis-server -yUbuntu 22.04 官方源里的 redis-server 默认版本是 7.0.x正好是 Redis 7。如果源里还是 6.x可以加 redis 官方 PPA 或从源码编译但一般不用。5.2 启动并验证WSL 版 Redis 不像 Windows 服务那样开机常驻需要手动启动守护进程sudo service redis-server start redis-cli ping它默认监听127.0.0.1:6379。WSL2 的网络地址与 Windows 主机不同但因为 WSL2 在较新版本中会自动做 localhost 转发所以你在 Windows 宿主机的 PowerShell 里执行redis-cli ping同样能通——前提是前面那个防火墙授权框没被你拒绝。如果要从局域网其他机器访问 WSL2 里的 Redis就需要端口代理这一步对小白稍烦。我的建议如果只是本机开发用 localhost 转发就够了如果团队里多人要连你机器上的 Redis直接在 WSL 里改/etc/redis/redis.confbind 0.0.0.0 requirepass 你的密码然后sudo service redis-server restart。这里提醒一下WSL2 的 IP 每次重启可能变化做端口转发时不要写死 IP尽量用 localhost 或配置 Windows 端口代理规则。5.3 与 Windows 文件系统交互WSL 里的 Redis 数据文件和日志默认在 Linux 文件系统下路径类似/var/lib/redis/dump.rdb。好处是性能好坏处是你可能在 Windows 资源管理器里找不到这些文件。如果你需要备份可以用cat /var/lib/redis/dump.rdb /mnt/c/backup/redis_$(date %F).rdb/mnt/c就是 Windows 的 C 盘挂载点。注意这样写出来的 RDB 文件跨了文件系统性能会拉胯但备份场景无所谓。6. 懒人方案Docker Desktop 里的 Redis 76.1 一条命令跑起来如果你机器上已经装好了 Docker Desktop这是最快的方式而且最接近 CI 里的 Redis 环境。在 PowerShell 里执行docker run -d --name redis7 -p 6379:6379 -v D:/redis-data:/data redis:7-alpine -p 6379:6379拆开解读一下-d是后台运行--name redis7给容器起名-p 6379:6379把宿主机 6379 映射到容器内 6379-v D:/redis-data:/data把 Windows 的D:\redis-data目录挂载到容器的/data目录这样容器销毁后数据还在最后的镜像名redis:7-alpine是 Alpine 精简约 30MB 的 Redis 7 镜像比完整版镜像启动更快适合本地开发。然后验证docker exec -it redis7 redis-cli ping输出PONG即成功。这一套的好处是与 Linux 生产环境几乎完全一致同时不用自己装 WSL 发行版坏处是需要 Docker Desktop 常驻内存占用比原生版高。6.2 自定义配置文件的正确挂载Docker 版改配置不能直接改容器内部因为容器重启后会被重置。正确做法是先在 Windows 上写好redis.conf挂载进容器并指定为启动配置docker run -d --name redis7 -p 6379:6379 -v D:/redis-data:/data -v D:/config/redis.conf:/etc/redis/redis.conf redis:7-alpine redis-server /etc/redis/redis.conf这里唯一要留意的是文件权限。Windows 上写的 redis.conf 换行符通常是 CRLF而容器里的 Linux 进程读 LF 更稳。如果配置里写的路径、密码、绑定项总是怪异地不生效先检查换行符。最稳妥的办法是在 VS Code 里把换行符改成 LF 再保存。还有一个高频故障挂载目录不存在时 Docker Desktop 会自动创建但目录权限有时会变成 root 所有容器内写dump.rdb会报Permission denied。遇到就用docker logs redis7看具体报错然后到 Windows 里给redis-data目录添加 Users 完全控制权限。6.3 容器版和原生版的取舍用了一段时间 Docker 版后我发现它有两个略显别扭的地方一是 Docker Desktop 每次启动服务要占约 2GB 内存二是局域网共享 Redis 时端口映射规则受 Docker Desktop 的虚拟网卡限制偶尔会出现奇怪的延迟。如果只是本地开发原生 Windows 版其实更轻量如果需要多人共享或模拟生产Docker 版更合适。别盲目给所有项目都套容器——工具是拿来解决问题的不是拿来显摆的。7. 装完不是终点验证 Redis 7 能正常干活7.1 redis-cli 几组必会命令不管哪种安装方式装完后都要做一套冒烟测试。用 redis-cli 或docker exec进入容器后执行# 基础读写 set hello world get hello # 设置过期时间 set session:9527 abc123 ex 60 ttl session:9527 # 查看服务信息 info server info memory # 清空当前数据库 flushdb其中info server能直接看到redis_version:7.x.x这是确认版本的最直接方式。info memory里找maxmemory_human能确认你前面的内存限制是否生效。据实际观测大部分配置问题都会在这几步里暴露。7.2 用 Python/Java 客户端做一次跨语言连接服务端装好了客户端也得连一次才放心。以 Python 为例先安装 redis-pypip install redis然后写一个最小验证脚本import redis r redis.Redis( host127.0.0.1, port6379, passwordStr0ng!Passw0rd, decode_responsesTrue, ) r.set(k, v) print(r.get(k)) print(r.ping())如果打印出v和True说明服务端、密码、网络三层都没有问题。Java 侧用 Jedis 或 Lettuce 也类似核心连接参数就是 host、port、password。要注意如果你改了密码客户端里不传 password会直接报NOAUTH Authentication required看到这个别慌就是认证没通过。7.3 可视化客户端连不上的典型原因很多人装完 Redis 后喜欢用可视化工具连一下比如 Another Redis Desktop Manager、Redis Insight 或 Navicat。连接不上时排查顺序如下先用redis-cli ping确认服务端活着检查连接工具填的端口是否为 6379检查密码是否与requirepass一致检查bind配置若工具跑在另一台机器Redis 必须监听可达网卡检查 Windows 防火墙是否放行 6379 端口。最后一条最容易被忽略。原生 Windows 版 Redis 启动时Windows Defender 会弹一次“允许 Redis 访问网络”的窗。如果你只点了关闭远程工具永远连不上。处理方式是到“防火墙和网络保护 → 高级设置 → 入站规则”里新建一条允许 TCP 6379 的规则指向 redis-server.exe。8. 常见问题与排查技巧实录8.1 启动失败、cmd 一闪而过遇到这种情况九成是配置文件里有语法错误或路径不存在。打开 cmd手动执行redis-server.exe redis.windows.conf不要双击窗口会停在错误信息上。最常见的错误是Opening config file ... No such file or directory因为 exe 的工作目录不在配置目录下。解决办法是启动时给配置文件的完整路径例如C:\redis7\redis-server.exe C:\redis7\redis.windows.conf8.2 端口被占windows 上杀不掉的老兵Redis 启动时端口绑定失败报bind: Address already in use。先用netstat -ano | findstr 6379找到 PID再用taskkill /F /PID PID强杀。但杀完不代表结束——Windows 上会有 TIME_WAIT 状态的连接残留等一两分钟端口才释放。如果 redis 没有任何旧进程却仍提示端口占用可能是其他软件占用。建议直接用 Docker 或 WSL 跑 Redis避开宿主机的端口纠缠。8.3 配置完全正确却总报 protected-mode这种问题大多出现在局域网访问场景。记住一条铁律protected-mode yes意味着如果没有requirepass且bind不只绑回环地址Redis 会拒绝执行命令。所以要么关掉 protected-mode要么设置密码两者选其一。但不要只关保护模式不设密码那样和裸奔没区别。8.4 Windows 关机后数据丢失有人会问我明明开了 RDB重启电脑后 key 全没了。绝大多数原因是启动的 exe 和配置文件的路径不匹配你服务注册用的redis.windows-service.conf里没开 save 策略或者启动时根本没有加载配置文件。处理方式是在配置文件里删掉所有#注释或者用config get save检查当前生效的持久化设置config get save config get dirdir决定了 dump.rdb 落在哪个目录。如果dir是.而你启动服务时工作目录是System32那 dump.rdb 就写在C:\Windows\System32\dump.rdb——你当然找不到。把dir改成绝对路径比如C:/redis7/data/一劳永逸。8.5 版本升级用 redis-cli 优雅迁移升级到新版时建议用redis-cli --rdb显式抓一次快照再在新版本里redis-cli --pipe导入。虽然直接复制 dump.rdb 在版本兼容范围内通常可行但 Redis 7 对某些内部数据结构做了调整跨大版本直接用旧 RDB 偶尔会报Bad file format。更稳的是先在旧节点执行bgsave把 dump.rdb 备份好再在新节点启动后通过恢复 RDB 验证没有数据再丢弃旧服务。9. 最后分享一点个人体会三条安装路线我都实跑过最终留在我开发机上的反而是“原生 Windows 移植版 服务模式”理由就三个字够轻、够快、够简单。WSL2 和 Docker 我留给需要模拟生产环境的项目它们更干净但每次打开 Visual Studio 系列 IDE 时再额外养一堆后台进程确实会增加系统负担。你完全可以根据自己的工作流选一个不用全装。另外装完 Redis 7 之后顺手把redis-cli的路径加到系统 PATH 里以后开任何终端都能直接敲redis-cli连服务这个小动作能让你每天省下几秒钟的输入时间。最后就是多给自己留一条安全线——密码、防火墙、持久化路径这三样在第一次启动前就配好之后的调试会顺畅得多。
返回列表