FEATURED · 精选文章

告别Windows Redis安装噩梦:用Docker Desktop跑Redis实战

发布时间 / 2026/9/8 17:03:01
来源 / 创域科博编辑部
栏目 / 资讯中心
告别Windows Redis安装噩梦:用Docker Desktop跑Redis实战 搞Docker的人应该都经历过这么一幕想在Windows上跑个Redis做本地开发结果去官网一看——Redis官方压根没提供Windows安装包。网上搜“Windows Redis下载”出来的要么是微软老掉牙的考古版本要么是第三方编译包装完还要手动注册服务、配置环境变量折腾半天没跑起来反倒把系统搞得一团糟。后来我换了思路直接用Docker Desktop装Redis。一条命令拉镜像、一条命令起容器本地开发环境干干净净想换版本就换版本想删就删几秒钟的事。这篇文章就把我这段实操经验完整拆给你从Docker Desktop安装时最容易卡住的虚拟化报错到Redis容器真正跑起来、配好密码和持久化再到可视化客户端连接、Spring Boot项目对接全程都有具体的命令、参数和排查思路照着操作就能在自己电脑上复现。1. 为什么要用Docker Desktop跑RedisWindows直接安装的坑与容器化的真实优势很多Windows用户第一反应是去redis官网下载Windows安装包但这件事本身就有一个认知偏差需要纠正。1.1 Redis官方从未发布Windows版本你下载的那些安装包来源复杂Redis官方文档写得很明确Redis是为Unix-like系统开发的官方不支持Windows。市面上能搜到的Windows版Redis主要有几个来源微软维护的早期移植版基于Redis 3.0/3.2版本非常老很多新特性不支持而且已经停止维护第三方个人或组织编译的版本更新节奏不一稳定性没有保障Memurai这类商业兼容方案虽然是正经产品但面向生产环境需要授权本地开发用老版本Redis其实问题不大关键是你在Windows上模拟的这套环境和Linux服务器上真实运行的Redis存在差异。举个例子Redis的持久化文件格式、内存管理策略在不同平台上的表现不完全一致你在Windows上验证通过的功能部署到服务器上可能因为版本差异或配置差异出现意外行为。1.2 Docker容器化让“本地环境”和“服务器环境”彻底对齐用Docker Desktop跑Redis最大的价值不是省去安装步骤而是让本地开发环境和服务器环境完全一致。你本地用的是redis:7.2镜像服务器上也用同一个镜像操作系统层、Redis版本层、配置层全都一样从根本上消除了“在我电脑上是好的”这种尴尬。我从几个维度对比过直接安装和容器化的差异供你参考对比项Windows直接安装Docker Desktop运行版本支持仅老版本或第三方编译包官方镜像版本齐全随时切换安装/卸载需要手动下载、配置、卸载残留处理容器删除即彻底移除不影响系统多实例管理同时跑多个Redis实例困难一个容器一个实例端口映射互不干扰主从/集群实验配置复杂调试成本高可快速启动多个容器模拟主从架构环境一致性与生产服务器环境存在差异镜像与服务器一致零差异迁移尤其是Redis主从复制、哨兵模式这类实验在Windows下直接做相当痛苦——每个实例都要单独配置、单独启动、手动管理进程。用Docker就简单得多几条命令就能拉起一个主从集群实验做完直接删容器什么都留不下。1.3 你真正需要什么先想清楚使用Redis的场景在动手安装之前我建议你先明确自己的使用场景因为你需要的Redis可能根本不需要Docker Desktop。如果你的目标是学习Redis命令和数据结构那么最简单的方式是使用Docker跑一个临时容器用完即删如果你的目标是本地开发调试比如Spring Boot项目要连接Redis做缓存那你需要的是一个带密码、有持久化配置的稳定容器如果你的目标是做Redis主从、哨兵或集群架构实验Docker Desktop几乎是Windows下最优的选择不少读者后台私信问我类似的问题我发现多数人其实卡在第一类或第二类场景上。这篇博文主要讲的是第二类——作为本地开发环境的Redis容器应该怎么装、怎么配同时兼顾第三类场景中大家问得最多的主从搭建方法。2. Docker Desktop安装避坑指南虚拟化报错的完整排查链路Docker Desktop本身安装不算复杂真正让一大波人卡住的是启动阶段。2.1 “Virtualisation support wasnt detected”到底是什么意思安装完Docker Desktop双击图标等了半天却弹出这样的提示Docker Desktop failed to start because virtualisation support wasnt detected.很多人在这一步就开始慌了以为是Docker Desktop安装包坏了卸载重装了好几次问题依旧。实际上这个报错的含义非常直接Docker Desktop需要在Windows上运行一个轻量级Linux虚拟机通过WSL2或Hyper-V技术而你的电脑当前没有满足虚拟化运行的条件。Docker Desktop在Windows上有两条技术路线WSL2模式基于Windows Subsystem for Linux 2Docker引擎运行在WSL2的轻量级虚拟机里Hyper-V模式基于Windows自带的Hyper-V虚拟化层无论哪条路线底层的x86虚拟化指令是必需的。如果CPU的虚拟化功能没有开启Windows就无法创建虚拟机Docker Desktop自然起不来。这个报错背后的实际原因通常有四个我按概率从高到低排列BIOS/UEFI中的虚拟化技术VT-x或AMD-V未开启Windows功能中的虚拟机平台或WSL2未启用电脑上存在旧版本的Docker Desktop残留配置或Hyper-V冲突CPU型号过于老旧不支持所需的虚拟化指令集2.2 排查步骤按顺序操作不要跳步我自己遇到过一次这个问题印象很深。当时新换了一台笔记本预装的是Windows 11家庭版安装Docker Desktop 4.26之后启动就报这个错检查一圈发现是BIOS里Virtualization Technology默认是Disabled。这里把完整的排查链路写出来你按顺序操作即可。第一步确认CPU虚拟化是否已在BIOS中开启。打开任务管理器切换到“性能”选项卡点击“CPU”在右下角查看“虚拟化”状态。如果是“已启用”跳过这一步如果是“已禁用”需要重启电脑按下主板对应的快捷键进入BIOS设置常见的是F2、Del或F10在Advanced或Configuration菜单中找到“Intel Virtualization Technology”或“SVM Mode”选项将其设置为Enabled保存并退出。提示不同品牌电脑的BIOS界面差异很大联想、戴尔、华硕的菜单位置各不相同如果在主菜单找不到可以搜索“电脑型号 进入BIOS 开启虚拟化”获取精确路径。第二步开启Windows的虚拟化相关功能。按下Win R输入optionalfeatures并回车打开“Windows功能”对话框勾选以下三项适用于Linux的Windows子系统虚拟机平台Hyper-V如果系统版本支持的话通常Windows专业版/企业版有这项点击确定后系统会提示重启电脑。这一步做完WSL2运行所需的Windows组件就齐了。第三步确保WSL2是默认版本。打开PowerShell管理员模式执行wsl --set-default-version 2如果之前没安装过任何WSL发行版最好先执行一次wsl --update这个命令会把WSL内核更新到最新版本Docker Desktop对WSL2版本有最低要求太旧的内核会导致Docker引擎无法正常通信。第四步重新启动Docker Desktop。完成以上三步后重启电脑再打开Docker Desktop观察右下角鲸鱼图标是否变成绿色Running状态。如果还是报同样的错误大概率是旧版本的配置残留可以尝试在“设置”中执行“Clean / Purge data”操作或者彻底卸载后重装一次。2.3 Docker Desktop启动后又崩了常见异常与解决对照表过了虚拟化这一关你可能会遇到新的幺蛾子。我把几个高频问题的症状和解决方案整理成一张表方便你直接对照查询症状可能原因解决方案启动后一直卡在“Docker Desktop starting...”WSL2内核版本过旧管理员PowerShell执行wsl --update然后重启报错“An unexpected error occurred”Docker引擎数据损坏执行docker desktop的“Troubleshoot”中的“Clean / Purge data”容器能创建但无法访问网络Windows防火墙拦截了WSL网络在防火墙入站规则中放行vpnkit.exe和docker.exeDocker Desktop启动后立刻退出旧版本残留文件与新版本冲突备份重要卷数据后彻底卸载手动删除%APPDATA%\Docker目录后重装WSL启动报错“参考的对象类型不支持尝试的操作”虚拟化平台或虚拟机监控程序未完全启用检查Hyper-V是否开启管理员PowerShell执行bcdedit /set hypervisorlaunchtype auto后重启2.4 安装完成后第一件事确认Docker引擎真的在工作Docker Desktop图标变绿不代表Docker CLI能正常通信。打开PowerShell或终端执行docker version如果输出中能看到Client和Server两段信息说明Docker引擎已经正常运转。正常情况下Server段会显示类似这样的内容Server: Engine: Version: 26.1.1 API version: 1.42如果只有Client段、没有Server段说明Docker引擎没有起来。此时执行docker info看具体的报错信息再进一步处理。我见过不少人卡在这一步Docker Desktop界面明明是绿的但docker命令就是连不上多半是WSL发行版没有正确关联到Docker Desktop检查一下“Settings - Resources - WSL Integration”中是否勾选了你正在使用的那个WSL发行版。注意如果你电脑上装了多个WSL发行版比如同时装了Ubuntu 22.04和Debian一定要在Docker Desktop的WSL Integration设置里勾选实际要用的那个发行版否则进入该发行版终端执行docker命令会提示找不到。3. 用Docker跑起第一个Redis容器从拉镜像到客户端验证环境就绪之后终于到了实际装Redis这一步。3.1 拉取Redis官方镜像版本选择策略打开终端执行拉取命令docker pull redis:7.2这里我推荐使用具体版本号而非latest标签。在生产实践中latest是不可控的——今天拉下来是7.2过几个月再拉可能就变成7.4甚至8.0软件行为可能发生微妙变化。本地开发和线上环境保持镜像版本一致是降低问题定位成本的关键。当前Redis稳定版线中7.2是一个成熟且广泛使用的版本8.0也已经发布如果你追求新特性比如Redis 8引入的向量集合也可以拉取redis:8.0。对于大多数场景7.2足够稳定资料也最多。拉取完成后用下面的命令确认镜像已经就位docker images输出中应该能看到REPOSITORY TAG IMAGE ID CREATED SIZE redis 7.2 a0b8b6c3d6a9 2 weeks ago 149MBRedis镜像本身只有一百多MB比很多中间件镜像轻量得多这也是它广受欢迎的原因之一。3.2 最基础的启动命令一条指令跑通下面这条命令是最小可用的Redis容器启动指令docker run -d --name redis-dev -p 6379:6379 redis:7.2逐段拆解这条命令的含义-d后台模式运行。不加的话终端会一直挂着关掉终端Redis就停了--name redis-dev给容器命名。不命名的话Docker会随机分配一个名字管理起来太痛苦-p 6379:6379端口映射。宿主机6379端口映射到容器内6379端口这是让本机程序能访问Redis的关键redis:7.2指定使用哪个镜像启动执行这条命令后使用以下命令确认容器状态docker ps此时能看到redis-dev容器处于Up状态端口映射列显示0.0.0.0:6379-6379/tcp。3.3 进入容器验证Redis可用性容器起来了但Redis是不是真的能正常工作需要实际测试一下。执行docker exec -it redis-dev redis-cli ping如果返回PONG说明Redis服务正常运行并且通过redis-cli能够正常访问。接下来我们实际操作几个Redis命令验证读写能力docker exec -it redis-dev redis-cli进入Redis命令行交互模式后依次执行127.0.0.1:6379 set mykey hello docker redis OK 127.0.0.1:6379 get mykey hello docker redis 127.0.0.1:6379 type mykey string可以看到Redis的常规读写操作已经正常工作。输入exit退出交互模式。3.4 容器生命周期管理启动、停止、删除的正确姿势本地开发调试过程中Redis容器会被频繁地启动、停止、删除。以下是我日常使用中很顺手的几个操作# 停止容器 docker stop redis-dev # 启动已存在的容器 docker start redis-dev # 重启容器 docker restart redis-dev # 删除容器 docker rm redis-dev # 强制删除运行中的容器 docker rm -f redis-dev需要特别留意的是docker stop只是停止容器进程容器本身和容器内的数据依然存在。而docker rm会删除容器如果这个容器启动时没有挂载数据卷容器内的所有Redis数据会一并消失。这一点非常关键直接引出下一节要讲的持久化配置。为什么要用Docker而不用其他方式除了前面提到的环境一致性还有一层理由容器的启停速度远快于传统的服务管理方式。Redis容器停止几乎瞬时完成启动也只需要一两秒。4. 配置持久化与访问控制让Redis容器达到可用标准刚才那个基础命令虽然跑通了Redis但离“本地开发环境可用”还有两个关键差距数据无法持久保存以及没有访问密码。4.1 Redis持久化的两种机制与Docker数据卷的配合逻辑先做一个简单的小实验。按上一节的命令启动一个Redis容器写入一个键值对docker exec -it redis-dev redis-cli set season spring然后执行docker rm -f redis-dev再重新启动一个新的Redis容器注意是新的因为旧容器已被删除docker run -d --name redis-dev -p 6379:6379 redis:7.2此时查询刚才写入的键docker exec -it redis-dev redis-cli get season返回的是(nil)。这说明数据已经彻底丢失。Redis本身是有持久化机制的——RDB快照和AOF日志都是Redis进程内部的行为。但问题在于容器是“一次性”的容器被删除时容器内所有文件包括RDB和AOF文件都会被清理掉。所以容器里Redis进程能不能持久化是一回事容器的文件系统是否能保留下来是另一回事。解决办法是Docker数据卷Volume。把容器内Redis存储数据的目录映射到宿主机的一个目录上这样无论容器如何删除重建数据都保留在宿主机上。Redis容器内的数据目录默认是/dataRDB和AOF文件都写在这个目录里。推荐的启动命令如下docker run -d \ --name redis-dev \ -p 6379:6379 \ -v redis-data:/data \ redis:7.2-v redis-data:/data的含义是创建或使用一个名为redis-data的Docker数据卷挂载到容器的/data目录。数据卷是Docker管理的特殊目录存放在宿主机上由Docker专门划定的区域。用命名数据卷还是用宿主机目录bind mount本地开发我推荐命名数据卷因为管理和备份更简单执行docker volume inspect redis-data就能看到数据实际存放的位置。如果你更喜欢用宿主机目录直观查看文件也可以使用-v /your/local/path/redis-data:/data这种方式适合需要频繁检查RDB文件或AOF文件的场景。4.2 设置访问密码保护你的本地Redis本地开发的Redis是否要设置密码这个问题有不同的观点。我倾向于设置一个简单的密码尤其是当你的Docker端口映射到了0.0.0.0时。这并非小题大做——有扫描工具专门探测公网和局域网中未设置密码的Redis实例一旦发现轻则数据被清空并勒索重则可能被写入定时任务反弹Shell。即便你的电脑在局域网内也不应该裸奔。设置Redis密码有两条路启动容器时通过命令行参数传入挂载配置文件命令行参数方式最直接适合快速启动docker run -d \ --name redis-dev \ -p 6379:6379 \ -v redis-data:/data \ redis:7.2 \ redis-server --appendonly yes --requirepass yourpassword123注意这个命令的精妙之处镜像默认的启动命令是redis-server后面追加的参数会覆盖默认配置。这里同时完成了两件事开启AOF持久化--appendonly yes和设置访问密码--requirepass yourpassword123。启动后验证密码是否生效docker exec -it redis-dev redis-cli执行任何命令都会提示报错(error) NOAUTH Authentication required.此时需要认证后才能操作127.0.0.1:6379 auth yourpassword123 OK 127.0.0.1:6379 set mykey hello with password OK提示使用docker exec进入容器时redis-cli默认连接的是容器内的Redis实例。容器外宿主机或代码连接时需要提供同样的密码。4.3 挂载配置文件最接近生产环境的做法命令行参数适合快速启动但如果你有一堆配置项要管理每个都通过命令行参数传会很混乱。更规范的做法是准备好一份Redis配置文件通过数据卷挂载到容器内让Redis启动时读取这份配置文件。先在宿主机上创建配置文件目录和文件mkdir -p ~/docker/redis/config vim ~/docker/redis/config/redis.conf配置文件内容建议如下# 开启AOF持久化 appendonly yes # AOF文件名 appendfilename appendonly.aof # AOF写入策略每秒刷盘兼顾性能与安全 appendfsync everysec # RDB持久化规则900秒内至少1次写操作或300秒内至少10次或60秒内至少10000次 save 900 1 save 300 10 save 60 10000 # 访问密码 requirepass yourpassword123 # 数据目录 dir /data然后启动容器并挂载这个配置文件docker run -d \ --name redis-dev \ -p 6379:6379 \ -v redis-data:/data \ -v ~/docker/redis/config/redis.conf:/usr/local/etc/redis/redis.conf \ redis:7.2 \ redis-server /usr/local/etc/redis/redis.conf关键点说明镜像内redis-server默认启动路径下的redis.conf不存在所以在镜像名之后指定的redis-server /usr/local/etc/redis/redis.conf是必需的它告诉容器内的Redis进程去读取挂载进来的宿主机配置文件。验证配置是否生效docker exec -it redis-dev redis-cli -a yourpassword123 ping返回PONG说明配置正确加载。4.4 数据备份与恢复的实用操作数据卷方案让Redis数据的备份变得非常简单。备份只需要把数据卷内容复制出来docker run --rm -v redis-data:/data -v ~/backup:/backup alpine tar czf /backup/redis-data-backup.tar.gz -C /data .这条命令启动了一个临时的alpine容器把redis-data数据卷打包到宿主机~/backup目录下。--rm参数保证临时容器执行完自动删除不留垃圾。恢复数据也是类似思路把备份包解压回数据卷docker run --rm -v redis-data:/data -v ~/backup:/backup alpine tar xzf /backup/redis-data-backup.tar.gz -C /data完整、无损、无需停止Redis服务。5. 进阶玩法与高频抽风现场网络模式、容器互联与排错实录把单个Redis容器跑起来只是第一步实际开发中你很快就会遇到一系列进阶问题。5.1 宿主机程序如何访问容器内的Redis这是初学者最容易困惑的问题。当你启动Redis容器并做了-p 6379:6379端口映射后宿主机上的任何程序都可以通过localhost:6379或127.0.0.1:6379直接访问Redis。原因在于端口映射建立了宿主机和容器之间的桥梁外部访问宿主机6379端口的数据会被自动转发到容器的6379端口。验证方式docker port redis-dev输出应该类似6379/tcp - 0.0.0.0:6379这说明宿主机所有网卡包括回环地址的6379端口都映射到了容器的6379端口。在Spring Boot项目中application.yml的连接配置就是spring: data: redis: host: localhost port: 6379 password: yourpassword123用JDK8的项目对应的是spring.redis.host配置写法略有不同但连接地址相同。5.2 Docker容器间的通信创建自定义网络更常见的开发场景是Redis在Docker容器里跑着你的后端应用也在另一个容器里两个容器之间如何通信有人可能会说直接用容器的IP地址。项目代码里写死IP显然不是好方案——容器重建后IP会变化每次都要改配置。解决方式是Docker自定义网络。在同一个自定义网络下的容器可以通过容器名互相访问。首先创建一个网络docker network create dev-network然后启动Redis容器时加入这个网络docker run -d \ --name redis-dev \ --network dev-network \ -p 6379:6379 \ -v redis-data:/data \ redis:7.2 \ redis-server --appendonly yes --requirepass yourpassword123启动另一个Spring Boot应用容器时也加入dev-networkdocker run -d \ --name my-app \ --network dev-network \ -p 8080:8080 \ my-app-image:latest此时你的Spring Boot应用不需要通过localhost访问Redis而是直接使用redis-dev作为主机名spring: data: redis: host: redis-dev port: 6379 password: yourpassword123Docker内置的DNS解析会把redis-dev解析为Redis容器的实际IP地址容器重建导致IP变化也不影响通信。5.3 快速搭建Redis主从结构的容器方案用Docker做Redis主从实验的体验确实比传统方式好太多。下面用标准的三容器主从方案演示。创建主从各自的数据卷目录mkdir -p ~/docker/redis/master ~/docker/redis/slave准备主从配置文件。主节点redis.confappendonly yes requirepass 123456 masterauth 123456从节点redis-slave.confappendonly yes requirepass 123456 masterauth 123456 replicaof redis-master 6379注意从节点配置里有两处关键masterauth用于主节点要求认证时从节点能提供正确密码replicaof指向主节点的容器名和端口。启动主容器和从容器docker network create redis-net docker run -d \ --name redis-master \ --network redis-net \ -p 6379:6379 \ -v ~/docker/redis/master/redis.conf:/usr/local/etc/redis/redis.conf \ redis:7.2 \ redis-server /usr/local/etc/redis/redis.conf docker run -d \ --name redis-slave \ --network redis-net \ -p 6380:6379 \ -v ~/docker/redis/slave/redis-slave.conf:/usr/local/etc/redis/redis.conf \ redis:7.2 \ redis-server /usr/local/etc/redis/redis.conf验证主从状态在从节点上执行docker exec -it redis-slave redis-cli -a 123456 info replication输出中可以看到role:slave master_host:redis-master master_link_status:upmaster_link_status为up表示主从连接正常。在主节点写入数据docker exec -it redis-master redis-cli -a 123456 set sku:1001 in-stock在从节点读取docker exec -it redis-slave redis-cli -a 123456 get sku:1001返回in-stock主从复制成功。实验完成后直接删除所有容器和网络docker rm -f redis-master redis-slave docker network rm redis-net整个过程不超过三分钟。5.4 常见反直觉问题的排查思路与解决手段实战中总会遇到一些表面上看不出原因的问题以下三个是我被问得最多的它们的共同点是——只看表面现象完全摸不着头脑。问题一容器正常运行但外部连接被拒。明明docker ps显示redis-dev容器Up状态端口映射也在但宿主机用redis-cli连接就是Connection refused。我的排查经验是优先考虑防火墙拦截。Docker在Windows上会通过vpnkit或类似组件代理网络流量Windows防火墙可能拦截了这些请求。在“Windows安全中心 - 防火墙和网络保护 - 允许应用通过防火墙”中找到Docker相关组件确保专用和公用两个网络类型都勾选了允许。修改后重启Docker Desktop问题通常能解决。问题二代码连接超时但redis-cli连接正常。应用的连接超时可能是网络模式不匹配。如果应用不在容器里直接连localhost没问题如果应用在另一个容器里但两个容器不在同一自定义网络中就无法通过容器名访问。用docker network inspect命令查看两个容器的网络归属确认是否在同一个网络中。问题三容器重启后设置丢失。那八成是你用了命令行参数启动容器却把重要配置都放在params里。更隐蔽的情况是使用docker stop再docker start去启动同一个容器设置没有丢但使用docker run创建的新容器即便参数相同之前所有的运行时修改都消失了。需要明确的是docker run每次都会创建全新的容器想要让配置永久生效必须把配置写入配置文件并挂载进来。问题四Redis容器日志里出现大量“Cant save in background: fork failed”报错。这个报错在Windows下跑Redis容器时偶尔会出现背后是内存分配机制的问题。容器内Redis执行RDB快照时需要进行fork操作如果文件系统或Windows的OS缓存占用过高fork可能失败。缓解手段是限制Redis内存上限在配置文件中加入maxmemory 512mb让Redis在内存接近上限时主动回收过期键降低fork压力。问题五docker-compose一键启停多容器环境。如果你身边维护的不止Redis一个中间件docker-compose的价值会立刻体现出来。下面这个docker-compose.yml是我本地开发用的services: redis: image: redis:7.2 container_name: redis-dev restart: always ports: - 6379:6379 volumes: - redis-data:/data - ./config/redis.conf:/usr/local/etc/redis/redis.conf command: redis-server /usr/local/etc/redis/redis.conf mysql: image: mysql:8.0 container_name: mysql-dev restart: always ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: root123456 MYSQL_DATABASE: myapp volumes: - mysql-data:/var/lib/mysql volumes: redis-data: mysql-data:在docker-compose.yml同级目录执行docker compose up -dRedis和MySQL同时启动一切依赖关系按照定义顺序处理。此时再不用挨个docker run开发环境的搭建从手工拼命令变成了代码库的版本化管理。执行以下命令关闭所有服务docker compose down但要注意docker compose down默认不会删除数据卷数据会保留下来。如果想连数据一起清理执行docker compose down -v数据卷删除后数据不可找回执行前务必确认是否要保留当前数据。5.5 Docker Desktop自身占用空间过大的清理经验跑了一段时间Docker后你可能会发现C盘空间飞速缩水。Docker Desktop在Windows上默认把镜像、容器、数据卷都放在C盘一个Redis镜像加上AOF日志可能占不了太多但如果你频繁拉镜像、重建容器、产生日志几十个GB就悄悄耗没了。Docker提供了空间清理命令按需使用docker system df输出中清晰显示镜像、容器、数据卷、构建缓存各自占据的空间。然后执行清理docker system prune -a --volumes该命令会删除所有未被使用中的镜像、停止的容器、无主数据卷以及构建缓存。注意-a参数会删除未被容器正在引用的所有镜像执行前务必确认没有需要保留的环境。如果清理完还是空间紧张可以考虑把Docker Desktop的存储目录迁移到其他分区。在Docker Desktop的设置中选择“Settings - Resources - Advanced”修改“Disk image location”的路径到空间充足的非系统盘点击“Apply Restart”生效。这个过程会把已有的镜像和数据迁移到新位置耗时取决于数据量大小。6. 本地开发的最佳搭档组合Another Redis Desktop Manager与RedisInsight的选型Redis容器跑起来后你还需要一个好用的可视化客户端来查看键值对、监控内存使用、检查过期策略。6.1 我用过的两款Redis桌面客户端对比Redis Desktop Manager曾经是最流行的选择但新版已经商业化收费。社区中免费开源替代方案中Another Redis Desktop Manager出镜率非常高微信小程序、管理后台等场景下这个工具我用了较长时间。另一款是Redis官方推出的RedisInsight功能强大更新频繁。对比项Another Redis Desktop ManagerRedisInsight开发方社区开源Redis官方收费模式免费免费支持平台Windows/macOS/LinuxWindows/macOS/Linux核心功能键值查看、命令行、慢日志键值查看、可视化分析、内存分析、CLI适合场景轻量级日常开发调试深度性能分析和调优内存占用较低较高中文字体支持好好如果你只需要快速查看键值、执行简单命令Another Redis Desktop Manager已经够用界面简洁没有多余功能启动也快。如果你需要对Redis进行性能体检比如查看哪些键占用了大量内存、分析大KeyRedisInsight的Memory Analysis功能会让你觉得惊艳它会扫描整个Redis并可视化地展示键值对的内存分布情况是优化性能的好帮手。6.2 RedisInsight连接容器的具体操作RedisInsight连接我们前面启动的Redis容器非常简单。安装RedisInsight后首次打开选择“Add Redis database”连接方式选择普通TCP连接填写Hostlocalhost因为做了端口映射Port6379Database Alias本地开发Redis如果有设置密码用户名留空密码填上你在配置文件或命令行参数中设置的requirepass值点击“Add”和“Test Connection”显示Connection successful即可。这里有个常见问题用RedisInsight时明明填对了密码却连不上检查一下Docker Desktop的端口映射是否还保持着执行docker ps看看6379映射是否消失。6.3 验证Spring Boot应用能正常缓存的小实验可视化客户端连接成功后最终验证的就是你的Java应用能否流畅地使用Redis做缓存。这里分享一个简单直接的验证方式。创建一个最简单的Spring Boot项目依赖里加上spring-boot-starter-data-redis。application.yml或JKD8下的application.properties配置spring: data: redis: host: localhost port: 6379 password: yourpassword123 timeout: 3s lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0写一个简单的验证逻辑使用StringRedisTemplateSpringBootTest class RedisConnectionTest { Autowired private StringRedisTemplate stringRedisTemplate; Test void testRedisConnection() { stringRedisTemplate.opsForValue().set(springboot:test, docker-redis-connected); String value stringRedisTemplate.opsForValue().get(springboot:test); System.out.println(Read from Redis: value); Assertions.assertEquals(docker-redis-connected, value); } }运行这个测试如果控制台输出Read from Redis: docker-redis-connected说明整个链路已经完全打通。6.4 Redis启动失败的自救集部署过程中难免遇到Redis容器起不来的情况以下是几条自救路径。先看容器日志这是第一现场docker logs redis-dev配置文件报错、端口占用、权限问题在日志里通常都能找到明确线索。如果日志信息不够明确退出容器看看进程状态docker inspect redis-dev关注State字段里ExitCode和Error信息。如果日志显示端口被占用换一个宿主机端口比如6380重新映射或者找出占用进程在Windows终端中netstat -ano | findstr 6379 tasklist | findstr PID找到占用进程后结束它或者换端口都行。如果Redis反复重启restart policy设置为always可能是配置文件中某个参数写错了Redis进程启动后主动退出。这种情况docker logs里会有明确的错误信息最常见的包括requirepass写成了requirepassword、配置文件中的行首包含非法空格等。还有几个容易犯的隐藏坑Redis配置文件的缩进不能随意行首不要有空格密码不要在配置文件和命令行参数中同时设置且数值不同容易造成困惑redis:7.2镜像的默认运行用户是redis而不是root所以挂载数据卷目录时要注意宿主机目录是否允许redis用户写入最后如果你用的是Redis 6.0以上的镜像在Spring Boot项目中需要特别注意——新版Redis默认开启了ACL身份验证机制如果配置了用户名默认的default用户具有所有权限编码时连接工厂里使用RedisStandaloneConfiguration时用户名不要随便填留空代表default用户加上密码即可连接成功。有些开发者习惯顺手填个root作为用户名这样反而会导致认证失败报错信息还不那么直观。我在本地同时维护多个项目的缓存环境时习惯给每个项目分配独立的Redis数据库编号通过配置文件中的database参数指定比如项目A用db0项目B用db1这样可以减少容器数量。真正遇到需要隔离的场景比如某个项目要实验Redis的一些高级特性再单独起一个容器按需灵活组合。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻