想在自己电脑上装个 Redis 练手,结果发现官方根本没有 Windows 安装包,这事儿你碰到过没有?我最早也走了一堆弯路,到处搜"Redis Windows 下载",找到的都是民间大神编译的版本,版本老不说,服务管理、配置文件的路径各个不一样,每次换电脑都要重新折腾一遍。后来我想通了:既然 Windows 上跑 Linux 容器的最佳方案就是 Docker Desktop,那直接在 Docker Desktop 里装 Redis 不就行了嘛。这篇文章就把我从安装 Docker Desktop 到跑起 Redis、再到配置持久化和主从复制的完整过程写下来,包括那些年我踩过的"Virtualization support not detected"之类的坑,给你一个从零到能存数据、可复现的实操方案。
这篇内容适合三类人:想在 Windows 上快速搭一套 Redis 环境做练习和本地开发的开发者;刚接触 Docker、想找一个轻量项目练手的朋友;以及准备做 Redis 主从、缓存治理等进阶实验但苦于环境装不起来的同学。我会尽量把每一步背后的原因也讲清楚,不只是贴命令,这样你遇到类似问题时能自己排查。
1. 为什么我不再折腾 Windows 原生 Redis,而选择 Docker 容器方案
先说结论:在 Windows 上跑 Redis,Docker 容器是最省心、最接近生产环境的方式。这不是因为我喜欢折腾容器,而是被原生安装方式折磨过之后做出的选择。
1.1 原生安装方案里的各种坑
Redis 官方从始至终没有发布过正式支持的 Windows 版本。你能搜到的"Redis-x64-xxx.zip",基本都是第三方基于旧版本编译的产物。这类版本有几个比较尴尬的问题:
- 版本落后,很多新特性用不上,比如 Stream 类型、Redis 8 的自动调参等新功能想都别想。
- 服务管理方式不统一,有的用 bat 脚本启动,有的需要注册成 Windows 服务,关个窗口服务就停了。
- 配置文件、日志目录没有统一规范,换台机器重新部署成本高。
- 崩溃了没人管,毕竟不是官方维护,遇到 bug 基本靠重启解决。
我知道有些人会用 WSL 直接装原生 Redis,这确实是另一个可行方案,但它的重复部署体验也不够好。你在这台机器上配好的环境,换一台电脑又得重来一遍,而且 WSL 里需要手动管理 Redis 进程,没有容器的进程守护和自启动机制。所以对我来说,Docker 才是那个"一次封装、到处运行"的正解。
1.2 Docker 方案解决了什么
Docker 容器解决问题的方式很简单:把 Redis 和它依赖的运行环境一起打包成镜像,你在任何装了 Docker 的机器上都能以完全一致的方式跑起来。
具体到 Windows 上,这个方案的收益非常直接:
- 环境隔离彻底,Redis 跑在容器里,不会污染宿主机系统。
- 版本切换干净利落,想换 Redis 版本就改镜像标签,然后重新跑一个容器。
- 数据持久化用数据卷(Volume)实现,容器删了数据还在。
- 主从、集群这些架构,可以用 docker-compose 一次性拉起多个实例,比在本地装多个原生服务方便太多。
提示:Docker Desktop 对大型企业有商业授权要求。如果你的公司规模在 250 人以上或年营收超过 1000 万美元,使用 Docker Desktop 需要购买订阅。个人学习和开发完全免费。
2. 先把 Docker Desktop 装好:安装流程与 Virtualization 报错排查
这是整个流程里最容易让人血压升高的一步。Docker Desktop 本身安装不复杂,但 Windows 环境的虚拟化配置千奇百怪,报错信息也五花八门。我一个个说。
2.1 下载与安装的完整步骤
Docker Desktop 的安装,说白了就三步:下载安装包、选择后端引擎、启动验证。但每一步都有值得注意的细节。
- 打开 Docker 官网的 Docker Desktop 下载页面,选择 Windows 版本下载。
- 双击安装包,进入安装界面后会有一个引擎选择的勾选项。这里我建议勾选"Use WSL 2 instead of Hyper-V"。WSL 2 的启动速度、内存占用和兼容性都比 Hyper-V 模式好,而且 Docker Desktop 官方现在也主推 WSL 2 后端。
- 安装完成后点Close and restart,Windows 会重启一次以启用相关功能。
- 重启后打开 Docker Desktop,等左下角的鲸鱼图标稳定不动,说明 Docker Engine 已经跑起来了。
- 打开 PowerShell 或 CMD,运行
docker version能看到客户端和服务端版本信息,就说明安装成功了。
安装包默认会装在 C 盘。如果 C 盘空间紧张,可以在安装过程中改安装路径。不过有一点要提醒你:Docker Desktop 除了安装目录,还有一个虚拟磁盘文件(ext4.vhdx),这个是 WSL 2 后端用来存放镜像和容器数据的,默认也在 C 盘。长期使用下来这个文件会越涨越大,具体怎么迁移我后面会提一下。
2.2 "Virtualization support not detected" 这类报错怎么破
很多人在启动 Docker Desktop 时会碰到这句话:
Docker Desktop failed to start because virtualization support wasn't detected.
这句话字面意思是检测不到虚拟化支持,但实际原因可能有好几种,我按照出现概率从高到低排列:
第一种:主板 BIOS 里的虚拟化开关没打开
这个最经典。Intel 平台叫 Intel VT-x,AMD 平台叫 AMD-V。重启电脑,开机时按 Del 或 F2 进入 BIOS 设置,在 CPU Configuration、Advanced 或 Security 相关菜单下找到对应的虚拟化选项,设为 Enabled,保存并重启。
判断它是否开启有一个快捷办法:打开任务管理器,切到"性能"标签页,看"虚拟化"这一项。显示"已启用"就说明 BIOS 层面没问题。
第二种:Windows 的虚拟化相关功能没开启
即使 BIOS 打开了,Windows 系统层面的功能关闭也会导致这个问题。需要检查两项:
- "虚拟机平台"(Virtual Machine Platform)
- "适用于 Linux 的 Windows 子系统"(Windows Subsystem for Linux)
打开方式:控制面板 -> 程序 -> 启用或关闭 Windows 功能,在列表里找到这两项,勾上并重启电脑。
如果系统提示找不到 WSL 相关项,可以在管理员权限的 PowerShell 里手动安装:
wsl --install这个命令会把 WSL 2 内核和默认发行版一并装好。之后检查一下默认版本:
wsl --set-default-version 2第三种:和第三方安全软件或旧版本 WSL 冲突
某些杀毒软件会把 Docker Desktop 的虚拟化进程误判为风险行为,直接拦截启动。如果你装了非常规的安全软件,可以暂时退出后重新启动 Docker Desktop 试试。
第四种:Windows 家庭版缺少 Hyper-V
Windows 10/11 家庭版没有完整的 Hyper-V 功能,但 Docker Desktop 走 WSL 2 后端并不需要 Hyper-V。只要上面两个 Windows 功能正常开启,这个报错在家庭版上也能解决。
排查完这些,再打开 Docker Desktop 一般就正常了。如果还是报同样的错,建议看下 Windows 系统更新是不是没打全,W SL 2 的组件需要较新的系统版本支持。
3. 拉取 Redis 镜像:从 docker pull 到容器启动的每一步
Docker Desktop 跑起来之后,接下来就是本篇文章的重头戏:把 Redis 容器跑起来。这个过程我拆成镜像选择、启动命令、验证三部分。
3.1 镜像怎么选:版本号和 alpine 后缀
在 Docker Hub 上搜 redis,会看到一堆镜像标签。核心要理解两个维度:一个是版本号,一个是镜像风格。
Redis 镜像的版本号直接对应 Redis 版本。目前主流生产环境大多用 7.0 到 7.4,我建议你拉redis:7.4-alpine。7.4 是 Redis 7.x 系列里比较成熟的版本,稳定性有保障。alpine 后缀代表这个镜像基于 Alpine Linux 构建,体积小、资源占用少,下载速度快。全量版和 alpine 版的功能配置方式没有本质区别,只是 alpine 里很多命令工具不存在,排查问题时少了一些辅助工具而已。
3.2 docker run 命令参数逐个拆解
拉取镜像本身很简单,docker pull redis:7.4-alpine就行。真正的关键是启动命令。这里是我常用的一条:
docker run -d \ --name redis-demo \ -p 6379:6379 \ -v D:/docker-redis/data:/data \ redis:7.4-alpine \ redis-server --appendonly yes --requirepass 123456我逐个参数解释一下:
-d:后台运行容器,不会霸占当前终端窗口。--name redis-demo:给容器起一个名字,后面管理容器时直接叫名字,不用记那串随机 ID。-p 6379:6379:端口映射,把容器内的 6379 端口映射到宿主机的 6379 端口。这样你可以在 Windows 本机上用 127.0.0.1:6379 直接访问容器里的 Redis。-v D:/docker-redis/data:/data:数据卷挂载,把宿主机 D 盘下的 docker-redis/data 目录和容器里的 /data 目录关联起来。Redis 的 RDB 持久化文件默认写在 /data 下,这样容器删了重建,数据文件还留在宿主机上。redis:7.4-alpine:镜像名和标签,注意启动命令里的镜像名要放在参数后面。redis-server --appendonly yes --requirepass 123456:容器启动时执行的命令,前面是启动 Redis 服务,后面追加两个配置项。--appendonly yes开启 AOF 持久化,--requirepass 123456设置访问密码。
这里有个非常容易踩的坑:配置项跟在镜像名后面会被当作容器启动命令的参数,但如果你写成:
docker run -d -p 6379:6379 redis:7.4-alpine --requirepass 123456Redis 也能启动,但--requirepass不是 Redis 服务的合法参数,Redis 会启动失败或用默认配置启动。正确做法是像上面一样,命令和参数用redis-server作为前缀。
3.3 容器状态验证与基本故障排查
启动之后,先看容器运行状态,这是判断一切是否正常的第一道关卡:
docker ps看到redis-demo的状态是Up,说明容器起来了。接下来验证 Redis 是否真的能响应请求:
docker exec -it redis-demo redis-cli -a 123456 ping这个命令进入了容器内部,用 redis-cli 带密码向本地 Redis 发送一个 PING,如果返回 PONG,说明 Redis 服务完全正常。
如果容器起来了但 Redis 访问不上,大概率是 protected-mode 在作怪。Redis 默认开启 protected-mode,当它检测到连接来自非本机地址且没有配置密码时,会拒绝访问。所以如果你启动命令里没加--requirepass,从 Windows 宿主机访问容器就会收到:
DENIED Redis is running in protected mode because protected mode is enabled and no password is set.解决方法不是关闭 protected-mode,而是补上密码。这也是我一直建议你至少设个密码的原因,既解决了访问问题,也顺手提升了安全性。
3.4 镜像下载慢的应对思路
如果你的网络环境下 Docker Hub 拉取速度不太理想,有几个务实的办法。首先是检查 Docker Desktop 的镜像源设置里有没有配置国内可用的镜像服务;其次是避开高峰期多试几次;如果拉了一大半总是失败,可以试着分步拉取或者改用体积更小的镜像标签。这些属于网络环境差异问题,我只能说没有一个放之四海而皆准的配置,但 Docker Desktop 本身的重试机制和增量下载在多数情况下是能扛过去的。
4. 连上去实操:数据类型、常用命令与客户端工具
Redis 跑起来只是万里长征第一步,真正要用好它,得理解它的数据模型。这一小节我用"能存什么、怎么存、存了怎么查"的思路,带你快速过一遍。
4.1 Redis 的五种基本数据类型和典型场景
String(字符串)
这是最基础的类型,value 可以是任意字符串,甚至可以存放序列化后的 JSON 或二进制数据。常用操作:
# 进入容器执行 redis-cli,-a 是认证密码 docker exec -it redis-demo redis-cli -a 123456 # 设置 key 为 foo,value 为 bar SET foo bar # 读取 key 的值 GET foo # 设置带过期时间的 key,单位是秒 SET code:12345 abc EX 60String 的高频场景包括:缓存页面片段、存会话信息、用SETNX实现分布式锁,以及用INCR做计数器。
Hash(哈希)
Hash 像是一个微型的行记录,适合存对象。比如一个用户信息:
HSET user:1001 name "tom" age 30 city "beijing" HGET user:1001 name HGETALL user:1001它省去了把整个对象序列化成一个字符串的过程,只是需要单独维护一个 key,字段增删改都很灵活。
List(列表)
Redis 的 List 是双向链表,可以从左或右两边插入和弹出,适合做简单的消息队列:
LPUSH task:queue "job1" LPUSH task:queue "job2" RPOP task:queueLPUSH往左边塞,RPOP从右边拿,先进先出就是一个队列模型。
Set(集合)
Set 的元素是唯一的,天然支持去重。经典场景是统计某活动页面的 UV:
SADD page:20250607:uv user001 SADD page:20250607:uv user002 SADD page:20250607:uv user001 SCARD page:20250607:uv再加一个用户,SCARD 返回的还是 2,因为 user001 已经存在了。
ZSet(有序集合)
ZSet 是 Set 的进阶版,每个元素多带了一个分数(score),按分数自动排序。排行榜是它的拿手好戏:
ZADD leaderboard 100 "playerA" ZADD leaderboard 200 "playerB" ZADD leaderboard 150 "playerC" ZRANGE leaderboard 0 -1 WITHSCORES这个命令会按分数从低到高列出全部成员和分数。如果要做从高到低排名,用ZREVRANGE leaderboard 0 -1 WITHSCORES。
注意:上面这几个命令我直接省去了密码参数。在实际复制到终端时,如果你启用了密码,redis-cli 交互模式一般不需要每次都加 -a,但非交互模式(比如
docker exec ... redis-cli -a 密码)就需要带。
4.2 可视化客户端怎么选
命令行够用,但如果你管理多个 Redis 实例,或者刚接触 Redis、想更直观地看数据,可视化客户端确实能提高效率。我用过的不外乎这几个:
- Redis Insight:Redis 官方出的免费客户端,界面现代,官方文档直接推荐,功能覆盖浏览数据、命令行、分析诊断。你如果不想花时间比较,直接选它。
- Another Redis Desktop Manager:一个开源的跨平台客户端,免费且更新活跃,连接 Redis 的基本操作都能覆盖,兼容性也比较稳。
- Redis Desktop Manager:老牌工具,当时很多教程推它,但它后面部分版本开始收费。新版本也有免费 IBM 兼容版本,但配置起来稍微麻烦一点。
从学习角度出发,我推荐你先用 Redis Insight。连接时填127.0.0.1、端口6379、密码就是你启动容器时设置的123456。能看到数据树、能敲命令、能查看内存统计,作为日常调试工具足够。
4.3 容器里的 Redis 坏了怎么快速重建
容器方案一个很大的好处是:容器状态搞坏了,重建一个就行。比如你手动改了容器里的某个配置文件导致 Redis 起不来,或者误删了容器,都不需要像物理部署那样从头安装一遍。执行docker rm -f redis-demo,再用之前的 docker run 命令新启一个容器,数据因为挂载在 D 盘而完好无损。这在日常实验和开发里特别实用。
5. 从实验走向生产:数据持久化与主从复制实践
做完上面的步骤,你已经有了一个能用的 Redis 环境。但如果你要拿它做正式项目,或者想学习 Redis 的高可用架构,还需要往前再走一步。
5.1 先搞懂持久化再动手
Redis 默认是把数据存在内存里的,一旦进程退出或机器重启,内存数据直接消失。所以持久化是生产场景的硬需求。Redis 提供了两种持久化方式:
- RDB(快照):在特定时间点把内存数据全量写入磁盘文件。优点是恢复快、文件紧凑;缺点是最后一次快照之后的数据可能会丢。触发条件和策略在 redis.conf 里通过
save配置项控制。 - AOF(追加文件):以日志形式记录每一个写命令,重启时重放日志来恢复数据。优点是丢失数据范围小;缺点是文件体积大,恢复速度慢。通过
appendonly yes开启。
前面启动命令里加的--appendonly yes就是 AOF 持久化的开关。RDB 默认就是开启的,所以实际上你只要不删容器,两种持久化文件都会生成在 /data 目录下。
如果你想更精细地控制 Redis 的行为,可以写一份 redis.conf 文件挂载进容器。我的常用写法是:
appendonly yes appendfsync everysec save 900 1 save 300 10 save 60 10000启动命令稍微改一下:
docker run -d \ --name redis-demo \ -p 6379:6379 \ -v D:/docker-redis/data:/data \ -v D:/docker-redis/redis.conf:/etc/redis/redis.conf \ redis:7.4-alpine \ redis-server /etc/redis/redis.conf注意挂载 redis.conf 时,宿主机目录下的文件必须真实存在,否则 Docker 会因为路径不存在直接创建一个空目录,Redis 发现配置文件为空就会走默认配置,绕过你所有的设置。这个坑我踩过不止一次。
5.2 用 docker-compose 拉起一主一从
Redis 主从复制是学习和实验高可用最基础的一步。主节点负责写,从节点复制主节点的数据,可以提升读能力,也为后面的哨兵模式打基础。
用 docker-compose 比逐个敲 docker run 命令更省心,配置清晰直观。先创建一个目录,比如 D:\docker-redis,在里面放一个 docker-compose.yml 文件:
services: redis-master: image: redis:7.4-alpine container_name: redis-master ports: - "6379:6379" volumes: - D:/docker-redis/master-data:/data command: redis-server --appendonly yes --requirepass 123456 redis-slave: image: redis:7.4-alpine container_name: redis-slave ports: - "6380:6379" volumes: - D:/docker-redis/slave-data:/data command: redis-server --appendonly yes --requirepass 123456 --replicaof redis-master 6379然后在当前目录执行:
docker compose up -d这样会启动两个容器。master 监听宿主机的 6379 端口,slave 监听 6380 端口。redis-slave的启动参数里写明了--replicaof redis-master 6379,意思是它要复制 redis-master 节点也就是 6379 端口的数据。
验证主从是否正常,可以看从节点的复制状态:
docker exec -it redis-slave redis-cli -a 123456 info replication输出里重点关注role:slave和master_link_status:up。只要 master_link_status 是 up,说明主从链路是通的。
然后做个实际写入测试:
# 往主节点写数据 docker exec -it redis-master redis-cli -a 123456 set myname "hello" # 从从节点读数据 docker exec -it redis-slave redis-cli -a 123456 get myname能读到同样的值,主从复制就验证通过了。这个 docker-compose 文件稍微扩展一下,就能演化出"一主多从"甚至"主从加哨兵"的结构,后续做缓存治理、分布式锁实验,底子就在这里了。
5.3 构建真实业务中的 Redis 思路
环境搭好之后,你可以带着业务问题来做实验。比如:String 的 SETNX 可以用来实现分布式锁,但锁的过期时间怎么设才不会被极端情况拖垮?缓存治理里缓存穿透、缓存击穿、缓存雪崩分别用什么 Redis 特性应对?这些问题的共性是:它们都是围绕你对 Redis 底层机制的理解展开的,而容器环境让你能随时开一个集群式的 Redis 来验证想法,而不是对着理论干想。
最后分享一个我自己的小习惯
这套环境跑通之后,我平时开发时会固定维护一个 docker-compose.yml,里面放上 Redis 和 MySQL 两个容器,目录结构统一放在 D 盘一个专门文件夹下。每次新项目上来,docker compose up -d一键拉起全套依赖,项目结束了docker compose down也不会留下脏数据。如果你打算长期在 Windows 上用 Docker 做开发,我建议你也把镜像、容器、数据卷拆开放在非系统盘,养成这种"基础设施代码化"的习惯,后面维护起来真的会省心很多。