ARTICLE DETAIL

资讯详情

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

Windows 安装 Redis:原生、WSL2、Docker 与配置避坑

Windows 安装 Redis:原生、WSL2、Docker 与配置避坑 本地写代码时想挂个缓存结果发现 Windows 上装 Redis 这件事网上的教程十篇有八篇是互相抄的还停留在把压缩包解压完双击一下 redis-server.exe 就完事的程度。真到自己动手问题一个接一个命令行窗口一闪而过没了、服务注册完开机不自启、可视化工具连上去显示一堆乱码、改了配置文件重启还是不生效。我自己在 Windows 上折腾 Redis 断断续续好几年从最早的微软移植版一路用到现在的社区构建版、WSL2 和 Docker踩过的坑基本上能凑成一本小册子。这篇内容就是把这条链路完整走一遍从版本选择、下载来源、目录规划、服务注册、配置项逐条拆解到客户端连接、可视化工具、WSL2 与 Docker 两条替代路线再到数据类型、序列化和缓存的日常治理。适合两类人看一类是刚接触 Redis、需要在 Windows 本机快速搭一个能用的环境做开发调试的同学另一类是已经在用、但一直被配置和服务管理问题反复折腾的人。全程按实操顺序推进每一步都说明为什么这么做遇到问题怎么定位。1. 先想清楚Windows 上跑 Redis 到底图什么1.1 本地开发场景下的真实诉求很多人一开始就把方向搞偏了想着我要在 Windows 上部署一个 Redis 服务。这个想法本身就有问题。Redis 的官方定位一直是 Linux 优先Windows 版本从来不是它的主战场你在本地搭的这一套绝大多数情况下只服务于一个目的让本机跑起来的项目能连上一个真实的 Redis而不是靠 Mock 或者内存 Map 糊弄过去。这个定位决定了你的技术选型标准。如果你只是本地开发调试那么稳定运行三个月不重启、支持主从哨兵集群这些要求基本可以忽略你真正需要的是启动快、配置改起来方便、能随时清库、能和你的 IDE 在同一台机器上和平共处。但如果你是想在 Windows Server 上给一个内部小系统提供缓存服务那标准就完全不同了这种情况下我更建议你直接上 Docker 或者干脆开一台 Linux 虚机别跟原生 Windows 版较劲。我见过太多人在这件事上浪费时间为了本地调试一个 Spring Boot 项目花了整整两天研究怎么把 Windows 版 Redis 做成开机自启的集群。这个投入产出比是崩的。先明确你是在做开发环境还是做类生产环境再决定投入多少精力这是省时间的第一个关键判断。1.2 原生版、WSL2、Docker 三条路怎么选Windows 上跑 Redis 目前有三条主流路径各自适应的场景差别很大方案上手难度版本新鲜度资源占用适合场景原生 Windows 构建版最低中等社区维护跟进很小本地开发、快速验证WSL2 内安装中等高等同 Linux 版中等想用接近生产的体验Docker Desktop中等偏高最高较大多实例、主从、需要隔离原生构建版最大的好处是解压即用不需要额外装任何东西一个几 MB 的压缩包扔到 D 盘改两行配置就能跑起来。它的短板也很明显版本通常滞后于上游一些新命令和新特性用不了而且它的持久化在极端情况下的行为跟 Linux 版不完全一致。WSL2 的体验是最接近生产的你在里面用的就是标准 Linux 包管理安装的 Redis配置文件格式、日志路径、systemd 管理方式全都一样写出来的经验可以直接搬到服务器上。代价是你得先有一台跑得动 WSL2 的机器还要处理 Windows 和 WSL 之间的网络互通问题。Docker 那条路适合需要跑多个实例的场景比如你想在本地验证一下主从复制、哨兵切换、或者不同版本的兼容性一个 compose 文件就能起一整套。缺点是 Docker Desktop 本身在 Windows 上比较吃资源老机器上跑起来风扇会转得很欢。我的建议很直接如果只是单机开发调试用原生构建版就够了五分钟能搞定如果后面有往服务器迁移的计划直接在 WSL2 里装如果要做多实例实验上 Docker。下面几节会把这三种方式都完整走一遍。2. 下载来源与版本选择别在第一步就埋雷2.1 官方只把 Linux 当一等公民Windows 包从哪来打开搜索引擎搜redis下载排在前面的结果五花八门有把旧版本打包重新分发的有夹带私货的也有指向国内镜像加速站的。这里需要建立一个基本认知Redis 上游对 Windows 的支持一直是非官方的、滞后于 Linux 的。目前你能拿到的 Windows 构建版主要来自几个渠道一是早年由微软技术团队主导移植、后来归档停更的版本最后停在了 3.x 这条线上二是社区里几位维护者接力做的移植分支把 5.x 系列补齐了 Windows 构建三是一些技术团队自行编译并公开的 7.x 构建产物。你在下载页面上看到的具体版本号基本能判断出它出自哪条线。这里有个细节值得注意下载时尽量选压缩包形态的发布产物而不是某个第三方打包的安装程序。原因很简单安装程序往往会在系统里写入注册表项、注册服务、甚至预置一些你不需要的东西出了问题很难排查干净。压缩包解压即用、删除即走对本地开发环境来说是最干净的形态。2.2 版本号怎么挑3.x、5.x、7.x 的真实差别版本选择这件事很多人是凭感觉挑最新的大版本号结果装了一个 7.x 的构建版跑起来发现某些命令行为和教程里对不上。实际情况是这样的3.x 这条线是微软移植版留下的遗产最大的特点是稳但缺的东西太多。没有 Stream 类型、没有部分新命令、Lua 脚本的支持也有边界问题。如果你只是拿它当纯粹的字符串缓存用它也能干活但不建议新项目选它。5.x 是社区移植版的主力战场这个版本段的功能已经相当完整Stream 类型、模块系统、更完善的持久化支持都有了。对于绝大多数本地开发场景5.x 是一个平衡点功能够用、稳定性经过了时间检验、文档和资料也最多。7.x 及更新的构建版能让你用上最新的命令和性能改进但要注意两个问题一是这些构建的质量参差不齐最好选择 star 数多、最近有提交记录的仓库产出的包二是部分新特性在 Windows 上并没有得到充分验证遇到奇怪的行为时你很难判断是配置问题还是平台问题。提示本地开发选 5.x 或者 7.x 的社区构建版都可以别纠结小数点后面的数字。真正影响你写代码的是命令语义而这块从 5.x 往后基本没变过。2.3 下载之后先别急着双击做两件小事拿到压缩包之后先做两件事能帮你后面省掉很多麻烦。第一件是选一个不带空格、不带中文、路径尽量短的目录来解压。比如D:\devtools\redis这样的路径。为什么不推荐放桌面或者我的文档下面因为这些路径里往往带空格或者中文字符而某些服务注册和配置文件解析的环节对空格的处理并不友好你会在注册服务时报一些看起来毫无头绪的错误。路径短一点还有个好处日志文件和管理脚本的路径写起来清爽不至于一行命令长得要换行。第二件是把压缩包里附带的配置文件单独备份一份。你现在拿到的这个文件是原始状态后面无论是改崩了还是想对比某个参数改前的值有一份干净的备份都是好事。我一般的习惯是复制一份改名为redis.windows.conf.bak放在同目录下同时把我自己改过的配置另存一份到笔记里注明改了什么、为什么改。3. 解压即用的原生版从目录规划到服务注册3.1 包里每个文件是干什么的解开压缩包你会看到一个不大的文件集合逐个认识一下redis-server.exe服务端主程序你要跑的核心就是它。redis-cli.exe命令行客户端用来执行命令、验证服务是否活着。redis-benchmark.exe压测工具本地验证性能的时候偶尔会用上。redis-check-aof.exe和redis-check-rdb.exe持久化文件损坏时的修复工具平时用不上出事的时候能救命。redis.windows.conf配置文件几乎所有需要调整的行为都在这里。Windows 服务相关的脚本文件用来把 Redis 注册成系统服务的。需要说明的是不同构建版的文件命名略有出入比如有的叫redis.windows.conf有的叫redis.conf有的会额外提供redis.windows-service.conf。这不是版本问题是打包者的习惯差异看到名字对不上不用慌认准后缀和内容即可。3.2 第一次前台启动与 PING 验证第一次启动建议用前台方式把日志直接打在屏幕上这样有任何问题你第一时间就能看到。打开命令行切到 Redis 所在目录执行redis-server.exe redis.windows.conf如果配置文件没有指定参数直接执行redis-server.exe也可以它会用内置的默认配置启动。区别在于默认配置下持久化、日志路径这些都不是你期望的行为所以第一次还是带上配置文件比较稳妥。启动成功的标志是窗口里出现了一大段日志最后一行通常是服务已就绪、正在监听某个端口的提示光标会停在原地不动这是正常的说明服务正在前台运行。这时候千万别关窗口另开一个命令行终端切到同一目录执行redis-cli.exe -h 127.0.0.1 -p 6379进入交互模式之后敲一个ping如果返回PONG说明服务端和客户端已经握上手了。再敲set hello world然后get hello能取回world整条链路就算通了。这两个动作看着简单但它们分别验证了两件不同的事ping验证的是连接和协议set/get验证的是读写和数据结构。3.3 注册成 Windows 服务让它在后台安静跑着前台运行的缺点是明显的窗口一关服务就没了而且那个黑窗口一直占着任务栏。正确的做法是把它注册成系统服务让它以后台进程的方式运行。注册命令长这样redis-server.exe --service-install redis.windows.conf --loglevel verbose执行完这条命令之后Windows 的服务列表里就会多出一个 Redis 条目。注意这里有个容易踩的点注册服务时传入的配置文件路径是相对路径服务启动时的工作目录可能不是你想象的那个目录。如果你的配置文件里写了类似dir ./data这样的相对路径注册成服务之后很可能因为工作目录变化而找不到目录导致启动失败。稳妥的做法是在配置文件里把所有路径都写成绝对路径或者在注册服务时先切到 Redis 目录再执行命令。服务注册好之后常用的几条管理命令记一下redis-server.exe --service-start redis-server.exe --service-stop redis-server.exe --service-uninstall前两条分别是启动和停止服务第三条是卸载。卸载之后记得去服务列表里确认一下条目是否还在有时候残留的占位项会影响你重新注册。3.4 卸载、换版本与残留清理想换一个版本的时候很多人是直接把旧目录删掉然后发现新版本注册服务失败。原因是旧的服务条目还挂在系统里占着名字。正确的顺序是先停止服务再执行卸载命令然后确认服务列表里已经没有 Redis 条目了最后才删目录。删目录的时候顺便检查一下几样东西dump.rdb和appendonly.aof这类持久化文件日志文件以及你之前注册服务时可能生成的任何脚本。如果你在配置文件里指定了dir指向别的目录那个目录也要一起清理否则新版本启动时会加载到旧版本留下的数据文件出现我怎么刚装完就有数据这种迷惑现象。4. redis.windows.conf 里真正需要你动手的配置项4.1 端口、bind 与 protected-mode 这三兄弟配置文件里最上面的几行就是你最先需要关注的。默认监听端口是 6379这个数字已经成了 Redis 的标志一般情况下不建议改。真正需要你判断的是这两个bind和protected-mode。bind决定了服务监听在哪个网络接口上。默认写的是127.0.0.1意思是只接受本机连接。这在你本地开发时是完全够用的而且是最安全的选择。如果你改成0.0.0.0或者注释掉这一行服务就会监听所有网卡同局域网的其他机器就能连上来——这在开发场景下通常是不必要的风险。protected-mode是保护模式开关默认是开启的。它有个很实用的行为当服务没有设置密码、并且监听的地址不是本机时它会拒绝外部连接并给出明确的提示。这个设计是为了防止有人把没密码的 Redis 直接暴露在网络上。本地开发建议保持默认开启别为了图方便关掉它。注意如果你的项目需要在局域网内让同事连你本机的 Redis 做联调正确的做法是设置密码而不是关掉保护模式。设置密码只需在配置文件里加一行requirepass 你的密码客户端连接时用-a参数带上即可。4.2 持久化RDB 与 AOF 在 Windows 上的取舍持久化这块Redis 提供了两种机制。RDB 是快照按时间间隔把内存中的数据整体写盘AOF 是追加日志把每一条写命令记下来重启时重放。配置文件里跟 RDB 相关的是这几行save指令save 900 1 save 300 10 save 60 10000它们的意思是900 秒内至少有 1 个 key 发生变化、或者 300 秒内至少 10 个、或者 60 秒内至少 10000 个就触发一次快照。这组默认值是在数据安全和写盘开销之间找的平衡点。本地开发其实可以把频率放低一点减少磁盘 IO但如果你在调试跟持久化相关的逻辑就别动它。AOF 默认是关闭的开启方式是找到appendonly no改成appendonly yes。AOF 还有一个关键参数appendfsync可选值有三个always每条命令都刷盘最安全但最慢everysec每秒刷一次兼顾安全和性能是默认推荐值no交给操作系统决定性能最好但丢数据的窗口最大。这里有个 Windows 特有的经验在较老的 Windows 移植版本上AOF 重写过程中如果遇到文件被其他进程打开可能会出现重写失败的情况。如果你在日志里反复看到 AOF 重写相关的报错先检查是不是有编辑器或者杀毒软件正在扫描那个文件。稳妥的处理方式是把日志目录和持久化目录放到杀毒软件的排除列表里。4.3 内存上限与淘汰策略别让本地机器被吃干净本地开发最容易忽略的就是内存限制。默认配置下 Redis 会一直占用内存直到系统扛不住你写着写着代码发现整个机器开始卡顿切到任务管理器一看redis-server 占了好几个 G。正确的做法是显式设置内存上限maxmemory 512mb maxmemory-policy allkeys-lru第一行限制最大可用内存第二行指定内存满了之后的淘汰策略。allkeys-lru的意思是从所有键里挑最近最少使用的淘汰掉这是纯缓存场景下最常用的策略。如果你的 Redis 里既有缓存数据又有你不想丢的关键数据那就用volatile-lru它只在设置了过期时间的键里做淘汰没设过期时间的键不动。Windows 上还有一个额外要注意的点任务管理器里看到的 redis-server 内存占用往往比你设置的 maxmemory 要小或者大一些这是因为内存统计口径的差异别盯着那一个数字较真看 Redis 自己通过info memory报出来的数据更准。4.4 日志、密码与高风险命令的处理日志这块默认配置下 Redis 是往标准输出打的注册成服务之后就看不到输出了。建议在配置文件里指定日志文件logfile D:/devtools/redis/logs/redis.log路径里的斜杠建议用正斜杠或者双反斜杠单反斜杠在某些解析场景下会被当成转义符处理这是很多人在 Windows 上配路径踩过的坑。密码前面提过了用requirepass设置。这里补充一个细节设置密码之后用 redis-cli 连接时如果不想每次输密码可以用-a参数但要注意这会让密码出现在命令历史里。本地开发无所谓真要严谨一点可以进交互模式之后用auth命令手动认证。高风险命令的处理是个容易被忽略的安全项。FLUSHALL和FLUSHDB这两个清库命令威力太大手一抖就能把数据清空。在配置文件里可以通过重命名的方式把它们禁用掉rename-command FLUSHALL rename-command FLUSHDB 把命令名改成空字符串就相当于禁用了。不过说实话本地开发环境我一般不这么干因为清库是高频操作这个技巧更适合那些在 Windows 机器上跑着给测试环境用的实例。5. 连上去命令行客户端与可视化管理工具5.1 redis-cli 的几条高频命令命令行客户端是排查问题时最可靠的伙伴因为它是官方自带的不存在协议兼容问题。除了前面说的ping、set、get下面这几条是日常用得最多的redis-cli.exe -h 127.0.0.1 -p 6379 -a 你的密码登录之后可以试这些info查看服务端的整体状态内存、连接数、持久化状态一览。info memory只看内存相关部分判断是不是快满了。config get maxmemory确认某个配置项当前生效的值。dbsize看当前库有多少个键。keys *列出所有键。这条命令在生产环境是禁忌在本地也建议少用因为它是全量扫描键多了会明显卡顿。要看键用scan迭代更安全。type 键名看某个键是什么数据类型。ttl 键名看还剩多少秒过期返回 -1 表示没设过期-2 表示键不存在。del 键名删除键。scan的用法稍微特殊一点它是游标式的scan 0 match user:* count 100返回结果里第一个数字是下一次迭代的游标第二个是这一批匹配到的键。游标返回 0 表示迭代结束。这个机制的好处是不会阻塞服务缺点是一次拿不全需要循环调用。5.2 可视化工具的连接配置与中文乱码问题命令行虽好但看数据不直观尤其是你想快速确认某个键存进去的到底是什么形态时。这时候就需要可视化工具了。目前用得比较多的几款功能上大同小异填主机、端口、密码就能连能按数据类型展开查看支持直接在界面上增删改键。连接配置本身没什么难度真正容易出问题的是两处。第一处是中文显示乱码。你在代码里用 JSON 序列化写入的中文用工具打开看到一串\u4f60\u597d这样的转义序列这不是工具坏了是序列化方式决定的。JSON 序列化器默认会把非 ASCII 字符转义成 Unicode 码点工具只是原样展示。解决办法是在序列化器上关闭转义或者在工具里切换显示格式。第二处是二进制数据显示不出来。如果你的项目用了 JDK 自带的序列化方式往 Redis 里写对象那么存进去的就是一坨二进制字节可视化工具打开只会显示乱码或者直接报错。这个问题不是工具能解决的根子在序列化方式的选择上后面第 7 节会详细说。5.3 连不上的五类报错与定位路径连接失败是最高频的问题报错信息看起来五花八门实际上归归类就那么几种。报错表现常见原因定位方法连接被拒绝服务没启动或端口不对任务管理器看进程netstat -ano | findstr 6379看端口连接超时被防火墙拦了或地址写错先用 127.0.0.1 试通了就是网络层问题提示需要认证服务设了密码客户端没带加上密码重连提示保护模式拒绝监听了外网地址且没设密码检查 bind 和 protected-mode连上就断客户端版本和服务端协议不匹配换用自带的 redis-cli 验证这里面的定位顺序有讲究先用自带客户端在本机连再用第三方工具连先用 127.0.0.1 连再用局域网地址连。每一步都是在缩小问题范围。如果自带客户端在本机都连不上那问题一定在服务端跟网络和工具没关系如果本机通、局域网不通那问题就在防火墙或者 bind 配置上。排查端口占用的那条命令值得记牢netstat -ano | findstr 6379输出最后一列是占用该端口的进程 ID拿到 ID 之后去任务管理器对照或者用tasklist | findstr 进程ID直接查进程名。本地开发时经常遇到的情况是之前那次启动没关干净新的实例起不来。6. 更接近生产的两条路WSL2 与 Docker6.1 WSL2 里装 Redis 的完整过程WSL2 的好处是你在里面用的就是标准 Linux 环境配置文件格式、命令行为、日志路径跟你以后部署到服务器上的完全一致。安装过程本身很简单进 WSL 终端之后sudo apt update sudo apt install redis-server装完之后 Redis 通常会自动启动。用systemctl status redis-server看一下状态如果是运行中的直接redis-cli就能连上。想改配置的话配置文件在/etc/redis/redis.conf改完sudo systemctl restart redis-server生效。WSL2 有一个网络上的注意点WSL2 默认的网络模式是一个独立的虚拟网络Windows 宿主机访问 WSL 里的服务通常没问题但反过来 WSL 访问 Windows 上的服务需要额外的地址处理。另外每次重启 WSL 之后 IP 可能会变如果你在配置文件里写死了 IP 做集群或者主从配置重启之后大概率就连不上了这种情况用主机名比用 IP 稳妥。6.2 Docker 单机与主从的 compose 写法如果你本机装了 Docker Desktop起一个 Redis 就是一行命令的事docker run -d --name redis-dev -p 6379:6379 -v redis-data:/data redis:7-alpine redis-server --appendonly yes这里几个参数的作用值得说明一下。-d是后台运行-p把容器端口映射到宿主机-v把数据挂到具名卷上——这一步很关键不加卷的话容器一删数据就没了。最后那串是覆盖容器启动命令这里开了 AOF 持久化。要玩主从复制的话用 compose 更清晰version: 3.8 services: redis-master: image: redis:7-alpine container_name: redis-master ports: - 6379:6379 command: redis-server --appendonly yes redis-replica: image: redis:7-alpine container_name: redis-replica depends_on: - redis-master command: redis-server --replicaof redis-master 6379 --appendonly yes起起来之后在主节点上用info replication能看到连接的从节点数量在从节点上执行写命令会被拒绝只能读。这就算把主从复制跑通了本地验证读写分离逻辑足够用了。6.3 三个方案的横向对比与使用建议把三条路径放在一起看选择标准其实很清楚。原生版胜在快和无依赖适合我现在就要一个能连的 Redis这种场景五分钟之内能搞定缺点是版本和特性上会落后。WSL2 胜在体验一致你写的配置、脚本、排查思路可以直接搬到生产环境适合有长期使用计划的人。Docker 胜在隔离和可复制起多实例、做实验、模拟集群都方便代价是资源占用大一些。我自己的用法是混着来日常写业务代码连的是原生版因为启动快、不占资源做跟缓存相关的架构验证时开 Docker起主从和哨兵需要复现线上问题时进 WSL2因为环境最接近。三者并不冲突端口错开就行。7. 数据落地到代码里类型、序列化和缓存治理7.1 五种基础类型在业务里的对应关系Redis 的几种基础数据类型各自对应的业务场景其实很明确选错了不仅浪费内存还会让代码变别扭。字符串类型是最常用的缓存单个对象、计数器、分布式锁的标记位都用它。列表类型适合做消息队列的简易实现、最新动态的时间线。集合类型适合去重、求交集并集比如两个用户的共同关注。有序集合在集合的基础上加了分值排行榜、延迟队列都是它的典型应用。哈希类型适合存对象的多个字段可以单独更新某个字段而不用整体覆盖。还有一种容易被忽略的类型是位图它本质上是字符串但按位操作用来做签到统计、活跃用户统计这类场景能把内存压到极低。我见过一个签到系统用位图存一年的签到记录一个用户只占几十个字节。7.2 Spring 项目里的序列化器选型这块是 Windows 本地开发时最容易出问题的地方因为它直接决定了你在可视化工具里看到的是什么。默认情况下如果你用RedisTemplate而不做任何配置它会用 JDK 序列化结果是键和值都变成二进制工具里根本看不懂。常见的三种选择StringRedisSerializer纯字符串可读性最好适合你自己手动拼 JSON 的场景。Jackson2JsonRedisSerializer把对象转成 JSON 存进去可读性和体积都不错。GenericJackson2JsonRedisSerializer在 JSON 基础上带上了类型信息反序列化时不用手动指定类型。我的实际选择是键一律用StringRedisSerializer值用 JSON 序列化器。原因很简单键是给人看的必须是可读的字符串值是给程序读的JSON 格式兼顾可读性和体积。另外有个坑要提醒JSON 序列化器默认不处理时间类型如果你的对象里有 LocalDateTime 字段需要显式注册时间模块否则反序列化时会抛异常。7.3 Key 命名、过期时间与缓存治理的几条经验Key 的命名一定要有规范不然后面维护起来很痛苦。我一般用冒号分层格式是业务模块:数据对象:唯一标识比如order:detail:10086。这样在可视化工具里按前缀筛选的时候非常清晰。过期时间是另一个必须考虑的点。缓存不加过期时间就等于埋了一颗内存炸弹。但所有键都设同一个过期时间又会导致某一时刻大批键同时失效数据库瞬间被压垮。实用做法是在基础过期时间上加一个随机偏移比如基础 30 分钟实际设置在 25 到 35 分钟之间浮动。还有一种情况是缓存穿透查询一个数据库里根本不存在的键每次请求都打到数据库。应对方式有两种简单的是把空结果也缓存一小段时间讲究一点的是用布隆过滤器提前拦截。本地开发时用第一种就够了。8. 排错实录几个把时间耗光的坑8.1 双击 redis-server 窗口一闪而过这个现象几乎每个人都遇到过一次。双击 exe 文件黑窗口闪一下就没了什么信息都没留下。原因很朴素启动了但因为某个原因立刻退出了而你没有机会看到错误信息。正确的排查姿势不是继续双击而是开一个命令行窗口切到目录手动执行。这样错误信息会留在屏幕上。常见的退出原因包括配置文件路径写错、配置文件里有语法错误、日志文件所在目录不存在、端口被占用。配置文件里指定日志文件但目录不存在是最隐蔽的一种。Redis 不会帮你创建目录它只会启动失败然后退出。所以你把logfile指向一个子目录之前先手动把这个目录建好。8.2 端口被占用与防火墙拦截端口占用的判断方式前面提过了netstat加findstr一把梭。这里补充一种迷惑情况端口没被占用但服务就是起不来。这时候要看看是不是上一次启动的进程还在只是监听在了别的端口上。用任务管理器按进程名排一下把残留进程结束掉再试。防火墙拦截通常发生在你想让局域网其他机器连过来的时候。Windows 的防火墙默认会拦住入站的陌生端口你需要为 6379 加一条入站规则。加规则之前先确认真的有必要本地开发不需要这一步。8.3 改了配置文件却不生效这个坑的根源几乎都是同一个你启动时用的配置文件和你改的那个配置文件不是同一个文件。常见的情况有几种注册成服务的时候指定的是另一个配置文件启动命令里根本没带配置文件参数用的是内置默认配置目录里同时存在好几个名字相似的配置文件改错了其中一个。排查方法很直接连上去之后执行config get logfile、config get maxmemory这些命令看看生效的值是不是你改的那个。如果不是就说明加载的不是你以为的那个文件。另外要记住通过命令行动态改的配置重启后就没了只有写进配置文件才能持久。8.4 分布式锁在本地测试的注意事项在本地用 Redis 做分布式锁验证的时候有几个点容易被忽略。加锁的正确姿势是一条命令搞定而不是先判断再设置SET lock:order:10086 token_value NX PX 30000NX表示键不存在才设置PX指定毫秒级过期时间。这两者必须放在一条命令里分成两条命令就会产生竞态。释放锁的时候不能直接删除得先确认这个锁是不是自己的否则会把别人的锁误删。惯用的做法是用 Lua 脚本把比较值 删除合成一个原子操作。还有一点本地开发时机器上的时钟和网络延迟跟生产环境差别很大在这边测出来的锁行为只能验证逻辑对不对不能用来评估生产环境下的性能表现。真正要压测还是得放到接近生产的环境里。最后分享一个我自己的习惯每次在 Windows 上折腾完一套 Redis 环境我都会把这次的启动命令、改过的配置项、遇到的问题和解决办法记在一个 Markdown 文件里跟配置文件放在同一个目录。半年之后你换了台机器或者要给别人搭环境的时候翻出这个文件十分钟就能复现出一模一样的环境。这个习惯让我在换设备时省掉了大量的重复摸索时间。
返回列表