在Windows上安装Redis本身不是什么难事,大部分教程都会直接告诉你:下载一个zip包,解压,双击redis-server.exe,完事。可等你真正把它放进日常开发环境,或者想让它像MySQL、Nginx那样开机自启、后台常驻,麻烦才会浮出来——窗口一关服务就没了,机器一重启还得手动去点一遍,同事问你怎么配密码、怎么让它跑在服务里,你也只能支支吾吾。这篇文章要解决的正好是这两个问题:在Windows上正确安装Redis,并把它注册成Windows系统服务,让它开机自启、后台运行、退出终端也不受影响。如果你搜索时不小心把Redis拼成了Reids,也不影响理解,下面统一用正确拼写来说。这个方法适合开发机、内部工具服务器,也适合需要快速搭建缓存环境的临时项目。
1. 为什么要在 Windows 上来折腾 Redis
1.1 先想清楚一件事:你要的是哪个 Redis
Redis本身是内存数据库,最常见的使用场景是做缓存、会话保持、排行榜和消息队列。它原生跑在Linux系系统上,但这不意味着Windows上不能用——只是获取途径比Linux下复杂一点。目前Windows上可用的Redis无非这几类:
- 非官方社区维护的Windows移植版,最常见的形态就是zip解压即用,里面包含redis-server.exe和redis-cli.exe。
- 官方在Windows上的支持一直不算积极,所以很多生产团队干脆用WSL跑Linux版,或者直接用云上托管的缓存服务。
- 自编译版本,适合硬核玩家,普通业务场景完全没必要。
既然标题已经明确是Windows安装,那我们讨论的就是第一类:zip解压版。它的优点是不依赖外部环境,也不需要额外安装运行时;缺点是版本不全都是最新版,所以在下载前要看清楚版本号和发布时间。我的习惯是优先选择较新的稳定版本,同时确认客户端驱动是否兼容,以免序列化协议、集群命令之类的行为差异坑到你。
1.2 “能跑”和“能长期用”是两回事
双击redis-server.exe,命令行窗口会显示启动日志,Redis也确实跑起来了。但这种方式有个致命问题:它绑定在你当前的登录会话里。一旦你关闭这个窗口、注销系统,或者重启电脑,Redis进程直接终止。对于写个小Demo当然无所谓,可一旦你要把它接入某内部系统、提供接口缓存,这就是典型的隐患。比如我遇到过有人在开发机上跑着Redis,突然断电后服务没起来,整个后台接口全部退化到直接查数据库,页面响应时间翻了几倍。这种事故本质不是Redis的问题,而是你根本没有把它当做常驻服务来管理。
注册成系统服务之后,Redis的启动、停止、状态查询都交给Windows服务管理器管理。好处非常明显:
- 开机自动启动,不需要登录桌面,服务在后台拉起;
- 进程崩溃时可以被系统捕捉,结合服务恢复策略实现自动重启;
- 网络连接、文件访问权限更可控,可以配置用指定账号运行服务;
- 日志和错误信息进入系统体系,排查问题时不用再看那个一闪而过的小黑窗。
所以后续所有步骤,都围绕“让它老老实实成为一项服务”这个目标来展开。
2. 安装前的版本选型和环境准备
2.1 下载版本与目录规划
下载时我只认准zip包,不建议用源码包在Windows上自己编译。源码里依赖项多,编译过程中碰到库缺失、环境变量不对的风险很高,投入产出比很低。选择zip包时注意看里边的文件名和文档说明,通常每个版本包里会有两个配置文件:一个是普通的redis.windows.conf,另一个是redis.windows-service.conf。后者是专门给服务模式使用的模板,里面的参数已经调整过,比如日志输出方式、是否输出到stdout等,和前台运行版有区别。
解压之后,我建议把目录放到一个干净、不含中文和空格的位置。比如C:\Redis或者D:\Redis,不要放到“C:\Program Files\Redis”这种路径。为什么强调这点?因为后面注册服务时要把可执行文件路径写进服务配置,路径里的空格会被命令解释器拆成两段,导致服务启动的时候找不到程序。你别觉得自己手动操作没问题,一旦写脚本自动化或者交给别人接手,路径里的空格就是一颗定时炸弹。
2.2 看懂解压后的文件布局
进入解压目录,核心文件只有几个:
- redis-server.exe:服务端程序;
- redis-cli.exe:命令行客户端,用来验证连接和操作数据;
- redis.windows.conf:前台运行使用的配置;
- redis.windows-service.conf:服务模式使用的配置;
- sentinel.conf:哨兵相关,分布式场景用得上,单机安装可以先不理。
我第一次装的时候犯过一个错:修改了redis.windows.conf,然后注册服务时发现配置完全不生效。后来才明白,服务默认加载的是redis.windows-service.conf。所以你要改哪个文件,必须心里有数。更稳的做法是:自己复制一份配置文件,命名成redis-prod.conf,启动时明确指定它。这样你改了什么、默认文件什么样,一目了然,后续升级版本的时候也不会把自定义配置覆盖掉。
2.3 核心配置建议在注册服务前改好
Redis默认配置可以直接启动,但我不建议就这么裸奔上去。有些参数必须在正式使用前调整:
- port:默认6379。没特殊需求就默认,如果和已有服务冲突,需要改成其它端口。
- bind:默认在某些版本里监听所有网卡,这意味着局域网内其它机器也能连到你的Redis。如果只是本机使用,建议改成127.0.0.1。
- requirepass:设置访问密码。Redis虽然也支持命令行传参,但写在配置里更直观,服务启动时会自动读取。
- appendonly:改成yes,开启AOF持久化,防止机器重启后数据全部丢失。对内存数据库来说,纯缓存场景可以不开,但如果你拿它存了部分业务数据,这个必须开。
- dir:持久化文件的存放目录。默认是当前工作目录,服务模式下可能会变成系统目录,最好显式指定一个明确的路径。
- logfile:日志文件路径。服务模式下日志不会输出到控制台,你不配logfile的话,出了问题连日志都找不到,排查难度直接翻倍。
- maxmemory:限制最大内存,避免服务长时间运行把机器内存吃满。建议根据服务器物理内存设置一个合理阈值,同时配合maxmemory-policy设置淘汰策略。
配置文件的语法非常简单,一行就是一个“参数 值”,用#号注释。Windows下路径可以用正斜杠,比如D:/Redis/data,这样就不需要处理反斜杠转义的问题,省心很多。
3. 把 Redis 注册成系统服务,完整实操
3.1 官方命令行自带的注册服务方式
Windows移植版Redis内置了服务管理指令,这是最简单、最推荐的方式。在解压目录下,打开管理员权限的命令行(这个很关键,普通权限没有系统服务操作资格),执行:
redis-server.exe --service-install redis.windows-service.conf --service-name RedisService --service-start-type auto这里拆开解释一下:
- --service-install:表示要注册一个Windows服务;
- redis.windows-service.conf:告诉Redis服务启动时使用哪个配置文件;
- --service-name RedisService:给这个服务起一个唯一名称,方便后面用net start/stop管理;
- --service-start-type auto:把启动类型设置为自动,开机时由系统拉起服务。
如果你还需要在命令行里直接指定端口和密码(不推荐,因为你已经在配置文件里设好了),可以再加--service-port 6379和--service-pass你的密码。但我个人强烈建议不要用这种双通道设置,因为配置文件优先还是命令行优先,在不同版本里表现可能不一致。统一在配置文件里管参数,减少歧义。
执行完安装命令后,服务列表中会出现RedisService。但这一刻服务还没启动。启动它可以用命令:
redis-server.exe --service-start或者用Windows原生命令:
net start RedisService停止服务就执行redis-server.exe --service-stop,查询服务状态用sc query RedisService。如果哪天不想要这个服务了,执行:
redis-server.exe --service-uninstall需要注意的是,卸载服务不会删除配置文件和数据目录,只是把系统服务注册表里的条目清掉。这点还算友好,毕竟数据无价。
3.2 用系统 sc 命令手工注册服务
有些场景不想用Redis自带的注册方式,可能是想精确控制服务恢复策略,也可能是软件版本太旧不带--service-install参数。这时可以直接用Windows的sc命令手动造一个服务。命令如下:
sc create RedisService binPath= "\"C:\Redis\redis-server.exe\" --service-run C:\Redis\redis.windows-service.conf" start= auto DisplayName= "Redis Service"这里面有两个魔鬼细节。
第一,binPath和=号之间有空格,这是sc命令的语法要求,删掉空格反而会报错。第二,binPath的值里如果包含带空格的路径,需要外面套一层双引号,里面再用转义双引号把可执行文件包起来,否则Windows会把路径截断。就像上面那样,Write起来很乱,但这是系统API的硬性规定。
注册完成后,用sc start RedisService拉起服务。这个方式相当于绕过了Redis自带的封装,直接告诉Windows服务管理器:“可执行文件是redis-server.exe,参数是--service-run加配置文件”。Redis收到--service-run参数后,会以前台模式运行,但它的宿主进程已经被Windows服务管理器接管,所以效果和官方注册方式是一样的。
关于服务恢复策略,sc命令也能配置。比如进程意外退出后,可以设置自动重启:
sc failure RedisService reset= 86400 actions= restart/5000/restart/10000意思是:服务失败后5秒自动重启,再失败10秒重启,一天内统计重置。此步骤对长期运维价值很大,至少能在进程异常退出时自动补救,不用等你手动发现。
3.3 用 NSSM 封装做兜底方案
Redis自带的注册方式很好用,但有些老版本移植包的服务命令可能不完整,或者你想要更丰富的守护能力,比如崩溃重启、输出重定向、环境变量注入。这时候可以引入NSSM(一个Windows下的服务封装工具)。它本质上是个壳,把任意可执行程序包装成系统服务。
NSSM使用非常直观,分三步:
nssm install RedisService "C:\Redis\redis-server.exe" "C:\Redis\redis.windows-service.conf" nssm set RedisService AppDirectory "C:\Redis" nssm start RedisServiceinstall命令的第一个参数是服务名,第二个参数是主程序,第三个参数是启动参数。AppDirectory设置工作目录,确保Redis相对路径相关的配置能找到正确的文件。如果还想输出日志,可以用nssm set RedisService AppStdout "C:\Redis\logs\redis.out.log"和AppStderr指定错误日志路径。NSSM的图形界面也很友好,运行nssm install不带参数会弹出窗口,可视化配置路径、参数、环境变量和服务恢复选项。
什么场景下值得用NSSM?我的判断标准是:当你不只跑Redis,还有一堆自定义脚本、批处理程序要当服务跑时,统一用NSSM管理,比每个软件各搞一套服务注册方式要清晰很多。另一个场景是,Redis以普通用户账号运行时,需要额外指定账号密码,NSSM在这方面处理得很方便。
3.4 启动验证与开机自启检查
注册服务之后,验证是必要步骤。先看服务状态:
sc query RedisService状态显示RUNNING说明服务运行中。再用客户端验证Redis是否正常响应:
redis-cli.exe -h 127.0.0.1 -p 6379 ping如果配置了requirepass,需要先认证:
redis-cli.exe -h 127.0.0.1 -p 6379 -a 你的密码 ping正常返回PONG,说明Redis已经可以通过服务模式对外服务了。还可以用netstat检查端口监听情况:
netstat -ano | findstr 6379看到“LISTENING”状态,说明端口已经监听。开机自启这块,如果你注册服务时选择了auto启动类型,系统重启后会尝试自动拉起。但有一种情况要注意:如果Redis依赖的网络环境还没就绪,可能导致服务启动失败。遇到这种问题,可以通过服务属性里的“恢复”选项卡设置失败后重启,或者使用延迟启动。所谓延迟启动,就是系统先启动基础网络服务,再启动你的自定义服务,把服务启动类型改为“自动(延迟启动)”,能减少启动链路竞态问题。
4. 常见问题与排查技巧实录
4.1 服务启动后立刻停止
这是注册服务后最常遇到的问题。现象是sc start之后提示启动失败,或者服务状态一会儿就是STOPPED。原因不外乎几个:
- 配置文件路径错误,redis-server.exe启动时根本找不到配置文件;
- 配置语法错误,某个参数写错导致进程初始化失败;
- 日志目录不存在,logfile指定的路径没有被创建;
- 配置文件里引用了不可访问的目录,服务账号没有权限。
排查路径要讲究顺序。首先去事件查看器看Windows日志,能找到服务控制管理器记录的进程退出码。然后确认Redis配置里logfile路径存在且可写,或者临时去掉logfile配置,让它用默认方式输出警告,再手动用命令行前台跑一次:
redis-server.exe redis.windows-service.conf看控制台输出报错信息,这是最直接的验证方式。前台能跑,服务起不来,那问题几乎都在路径、权限和配置加载方式上。再来一次注册,确认服务binPath里的配置路径和文件名没有拼写偏差。很多时候所谓“莫名其妙起不来”,只是路径中多了一个空格,或者配置文件放在别处被忽略了。
4.2 端口被占用或被防火墙挡住
装了Redis之后连接不上,先查端口。本机通常是bind或者防火墙的问题。我遇到过的情况是:Windows Defender防火墙默认拦截新监听端口的入站请求,如果你不弹出允许提示,且没有手动添加规则,外部机器永远连不上。本地连接一般不受影响,但你想让局域网的同事或者测试环境连过来,就必须在防火墙里放行对应端口。
放行操作:打开高级安全Windows Defender防火墙,新建入站规则,选择端口,填入6379,允许连接。有个安全意识要记住:如果Redis只给本机用,bind改成127.0.0.1其实比防火墙更优雅。别把端口暴露到外网,Redis默认没开通加密,密码明文传输,暴露公网的风险很高。
如果你怀疑端口被其它进程占用,用netstat找到占用进程的PID,再到任务管理器确认具体程序。千万别随意kill系统进程。如果冲突确实存在,最简单的做法是改Redis端口,同时把注册服务时的命令行参数和配置文件同步改掉。
4.3 密码配置不生效,连接被拒绝
很多新手在配置文件里设了requirepass,但客户端连接时报“NOAUTH Authentication required”,或者更奇怪的“connection refused”。前者通常是客户端没传密码,后者则跟密码无关,是服务根本没起来。当我们确认服务运行中,且配置里确实有requirepass,就要检查是不是配置文件加载错了。
前面提过,redis.windows.conf和redis.windows-service.conf是两套文件。你改了普通配置文件,但服务加载的是service版,密码自然不生效。这个坑我见过好几个人踩,最后都是通过日志路径或者启动命令行确认的。更稳妥的办法是看一眼当前进程实际加载的配置:
redis-cli.exe config get requirepass这个命令返回的值,才是真正对当前实例生效的配置。不过要注意,未认证时执行config命令也可能被拒绝,此时你还是先检查服务注册命令里的配置路径更实在。
另一个容易被忽略的细节是protected-mode。默认情况下,如果Redis没有设置密码,protected-mode yes会拒绝来自外网的非回环地址连接。如果你只设置了bind 127.0.0.1,那即使是密码错误,也不会出现“connection refused”这种假象。排查时要把bind、requirepass、protected-mode三个参数放在一起看,它们共同决定了“谁能连、怎么连”。
4.4 内存、持久化和日志运维要点
Redis作为内存数据库,不设置maxmemory的情况下,会一直用下去直到触达系统上限。开发机还好,生产或长期承载流量的小服务器就要格外注意。建议在配置文件里设置:
maxmemory 2gb maxmemory-policy allkeys-lru这个策略的意思是:当内存达到2GB,按LRU算法淘汰最近最少使用的key。如果你的业务允许缓存数据被丢弃,这比OOM导致进程直接挂掉要靠谱得多。
持久化方面,单靠默认快照不一定够。配置appendonly yes之后,Redis会把写操作追加到AOF文件。AOF模式下dir路径必须是已存在的目录,否则Redis启动时会报错。如果你计划把Redis作为核心缓存,建议同时开启RDB快照和AOF,并把持久化文件放在非系统盘,方便备份和迁移。
日志方面,服务模式下Logfile要显式配置出来。我习惯按周清理或手动归档,因为单机Redis日志量可能不大,但时间长了还是会积累。定期做redis-cli info memory和info persistence检查,能提前发现内存增长趋势和持久化文件分裂问题。数据量大的话,可以用BGSAVE对数据目录做一致性快照,再配合备份脚本把RDB文件复制到别的位置。
5. 从我自己的踩坑经历说起
最初我在自己机器上装Redis,用的是最传统的前台窗口方式,后来一个内部工具的缓存数据总是丢,才意识到窗口一关Redis就停了,所谓“缓存”根本没稳定存在。第一次尝试注册服务时,也经历了启动即停止、密码不生效这些鬼打墙问题,最后都是回到配置文件和路径这两个原点排查。
所以如果你现在正准备装Redis,我的建议很简单:先把服务模式想清楚,再动手。下载zip包、解压到纯路径目录、改好service版配置文件、用官方命令注册服务,这套流程熟练之后十分钟内肯定跑通。如果你还要管好几台Windows机器,可以把注册服务命令写成bat或PowerShell脚本,每台机器执行一遍,效率翻倍。如果目标机器异常多,或者需要纳入自动化管理,就用NSSM统一包一层,配合服务重启策略,省去大量手工操作。
写这篇分享,也是因为这件事看似简单,实际每一步都有选择,而每个选择背后都藏着“为什么”。希望后来者不用再走我走过的弯路。