☰
Windows下用bat脚本一键启动Redis的完整实践
2026/9/28 14:07:14 网站建设 项目流程

1. 为什么我在Windows上绕不开bat这条启动路径

先说我实际遇到的问题。我平时在Windows笔记本上做本地开发,Redis几乎天天要用。可官方下载页面只提供Linux和容器版本的下载,Windows用户想装Redis,要么找社区移植版,要么自己编译。好不容易把解压包弄下来,又会陷入另一种麻烦:每次都要打开终端、切目录、敲redis-server.exe redis.conf,敲完终端还不能关,一关Redis就跟着没了。后来我干脆写了一个bat文件放到项目里,双击就完事,启动Redis这件事从此变成了双击两下。这篇文章就把我这套“Windows下用bat命令文件启动Redis”的做法完整整理出来,从环境准备、配置修改,到脚本写法、踩坑记录,全部按可以直接复现的方式写。

1.1 Windows没有“官方”Redis包

首先要接受一个事实:Redis官方其实并不直接提供Windows二进制包。官网上给出的下载源主要是Linux源码,还有Docker镜像。Windows下你能拿到的版本基本都是社区维护的移植版,常见的有两个来源:

  • GitHub上的tporadowski/redis,基于Redis 5.0.x的Windows移植,国内很多教程都是用它。
  • GitHub上的redis-windows仓库,有更新一些的Redis 7.x版本,支持64位,zip和msi格式都有。

我个人的习惯是优先选zip绿色版。原因很简单:zip解压出来就是一个目录,里面是redis-server.exe、redis-cli.exe、redis.conf这些文件,不写注册表,不注册服务,想卸载直接删目录就行。msi安装版也不是不行,但它可能会顺手把Redis注册成Windows服务,新手装了之后发现Redis“莫名其妙自己就在后台跑着”,想彻底清掉还得去services.msc里手工找,反而更麻烦。

还有一个商业替代品叫Memurai,兼容Redis的API,平时做本地开发用也行。但对大多数只需要“在Windows上把Redis跑起来”的场景,社区版已经够用了,没必要再引入商业组件。

1.2 手动敲命令、Docker、系统服务,为什么都不如bat顺手

我见过不少人在Windows上启动Redis的方式,基本可以分三派:

  • 手动敲命令派:打开cmd或者PowerShell,cd到Redis目录,执行redis-server.exe redis.conf。问题很明显——命令长、目录容易记错,而且一旦把终端窗口关掉,Redis进程直接没了。
  • Docker Desktop派:装个Docker,然后docker run redis。这套方案本身没问题,但为了一个本地的内存数据库去跑Docker Desktop,内存和CPU开销都不小,机器稍微弱一点就非常难受。
  • 系统服务派:把Redis装成Windows服务,开机自启。这个方案适合“长期常驻”的场景,但对开发调试来说太笨重。你改个redis.conf想重启看效果,光服务启停就要等半天,查看实时日志也不直观。

bat文件的好处恰好戳中了这些痛点:它可以把“切换目录、指定配置文件、检查端口、启动进程”这些重复动作一次性固化下来,双击就能运行,脚本还可以直接提交到Git仓库。团队里任何一个人克隆代码后双击bat就能起Redis,不用再口口相传“你要先cd到哪里,再执行什么命令”。这个价值在多人协作里远比想象中大。

1.3 我理想中的Redis启动脚本要具备什么

经过几轮折腾,我对一个“合格的Redis启动bat”有了明确的预期:

  • 双击后在任意位置都能定位到Redis目录,不会出现“找不到redis-server.exe”;
  • 能按固定配置文件启动,不用每次手工指定;
  • 启动前先检查6379端口是否被占用,避免出现“明明启动失败,窗口却一闪而过”的情况;
  • 能给出一眼就看懂的反馈,比如“启动成功”“端口被占用”“Redis正在运行”;
  • 最好还能顺便停掉Redis,省得到时候靠任务管理器去杀进程。

这篇文章后面就是按这个标准往下写的。

2. 动手前先把Redis环境理清:解压、目录规划与配置文件

在写bat之前,先把Redis的目录和配置整理清楚很重要。脚本只是“最后一公里”,如果Redis目录乱糟糟、配置文件里路径都是错的,脚本写得再漂亮也白搭。

2.1 解压后的Redis目录与推荐的目录结构

一个完整的zip版Redis解压开后,通常包含这些文件:

  • redis-server.exe:服务端主程序,后面bat启动的就是它;
  • redis-cli.exe:命令行客户端,验证连接、执行命令都要靠它;
  • redis-benchmark.exe:压力测试工具,给Redis做简单性能测试时用;
  • redis-check-aof.exe / redis-check-rdb.exe:AOF和RDB文件的修复检查工具;
  • redis.conf:示例配置文件。

不要直接把exe和conf堆在一个文件夹里就完事。我推荐按下面这种结构组织:

D:\dev\redis-7.2\ ├─ bin\ # 放exe文件 ├─ conf\ # 放redis.conf及多实例配置文件 ├─ logs\ # 放运行日志 ├─ data\ # 放RDB快照和AOF文件 └─ *.bat # 启动脚本放在最外层

这样组织的好处是显而易见的:升级Redis版本的时候,只需要替换bin目录里的exe,配置和数据都留在原地,重启一下就能平滑切换。这个习惯在Windows和Linux上都是通用的。数据目录、日志目录单独放,也方便后续做备份和排查。

2.2 redis.conf里必须亲手改的几项

拿到示例配置后,不推荐直接原样使用,至少要把下面几个参数搞清楚。

参数默认值本地开发建议说明
port63796379端口,多实例场景改为6380、6381等
bind127.0.0.1127.0.0.1指定监听地址,只本机访问时保持默认即可
daemonizenono是否后台运行,bat前台启动场景保持no
logfile""(空)""(空)日志文件路径,空表示输出到标准输出
dir./D:/redis/dataRDB和AOF文件的写入目录,注意用正斜杠
requirepass""(空)本地可不设访问密码,多人共用环境务必设置
appendonlyno视需求开启是否开启AOF持久化,数据重要时建议yes

关于daemonize这里要多说一句。很多人在Linux上习惯了daemonize yes,到Windows上也照抄,结果bat执行后cmd窗口马上跳回提示符,Redis在后台跑,日志看不到,报错也看不见。对bat场景来说,daemonize就保持no,让Redis作为前台进程运行,所有日志直接打在当前窗口里,出问题一眼就能看到。这其实是“临时启动调试”场景下的最佳体验。

requirepass的设置也要客观看待。如果Redis只运行在本地回环地址127.0.0.1上,不设密码问题不大;如果后面为了局域网调试把bind改成了0.0.0.0,那就必须设密码,否则局域网里任何一个人都能连进来读写数据。

2.3 一个最小可用的配置模板

下面这份配置是我日常本地开发用的,基本可以拿来就抄:

bind 127.0.0.1 port 6379 daemonize no logfile "" dir "D:/redis/data" save 900 1 save 300 10 save 60 10000 appendonly yes appendfilename "appendonly.aof"
  • bind和port控制监听地址与端口,本地开发绑定127.0.0.1就够了;
  • daemonize no保证日志显示在窗口里;
  • logfile留空,让Redis写标准输出;
  • dir路径必须保证目录已经存在,Redis启动时一般不会自动创建data目录,目录不存在会导致RDB快照写入失败;
  • save三行是RDB快照触发策略:900秒内有1次写、300秒内有10次写、60秒内有10000次写,满足任一条件就落盘;
  • appendonly yes表示同时开启AOF,数据更安全,会生成appendonly.aof文件。

有基础的同学可以按自己的数据安全级别调整save和appendonly,没基础的就先用这份配置跑通,后面再慢慢理解。

3. 第一版启动脚本:从“双击能用”到“顺手好用”

环境准备好之后,终于可以写bat了。先从最朴素的版本开始,再一步步加功能。

3.1 三行就能跑的初版

保存一个txt文件,命名为start-redis.bat,内容如下:

@echo off cd /d "%~dp0" redis-server.exe redis.conf pause

逐行解释一下:

  • @echo off是关闭命令回显,让脚本执行时不在屏幕上把每一条命令都打印出来,输出干净;
  • cd /d "%~dp0"是把当前目录切换到bat文件所在的目录,%~dp0是一个内置变量,代表“当前bat文件所在的完整路径,末尾带反斜杠”。这个写法尤其关键——不管你是从桌面双击,还是从资源管理器里双击,脚本都能自动回到Redis目录,不会出现找不到redis-server.exe的问题;
  • redis-server.exe redis.conf就是用当前目录下的配置文件启动服务;
  • pause是“暂停”,让cmd窗口执行完命令后不会瞬间关闭,保留输出界面。

很多新手双击bat之后窗口一闪而过,连报错都看不到,十有八九就是漏了pause。所以初版无论如何都要把它写上。

3.2 升级版:启动前自检,别让报错一闪而过

初版能用,但不完善。比如Redis目录里没有redis.conf的时候,脚本会提示找不到文件,但那一瞬间的报错谁能看清?我后来把自检逻辑加了进去,变成了下面这版:

@echo off chcp 65001 >nul title Redis Server @ 6379 cd /d "%~dp0" if not exist redis-server.exe ( echo [Error] redis-server.exe not found in current dir. pause exit /b 1 ) if not exist conf\redis.conf ( echo [Error] conf\redis.conf not found. pause exit /b 1 ) netstat -ano | findstr /C:":6379" >nul if not errorlevel 1 ( echo [Warn] Port 6379 is already in use. ) else ( echo [OK] Port 6379 is free, starting... ) redis-server.exe conf\redis.conf pause

这里有几个细节值得单独说明。chcp 65001 >nul的作用是把代码页切换到UTF-8,如果你把这个bat文件保存为UTF-8编码,中文提示才能正常显示;但注意,如果你的系统是简体中文Windows,更稳妥的做法是把bat文件保存成ANSI编码,那样连chcp都可以不要。这个编码问题后面我还会专门讲。

title命令给cmd窗口设置了一个标题,多窗口混在一起时一眼就能认出哪个是Redis。if not exist就是文件存在性检查,任何一个条件不满足就输出错误并等待按键,避免脚本在错误的目录里继续往下跑出诡异的问题。

netstat -ano | findstr /C:":6379" >nul则是端口占用探测。这里一定要用findstr /C:这个写法,因为findstr默认会把空格当作分隔符,直接写findstr ":6379 "之类的话,空格会成为多个匹配模式,导致误判。用/C:指定完整字面字符串才是最稳的。

3.3 再加一个小菜单:启动、状态、停止一把梭

启动搞定了,但“停止Redis”还得再开一个终端敲redis-cli shutdown,我觉得不够爽快。于是给脚本加了个简易菜单,一个bat文件同时管启动、状态、停止和退出:

@echo off chcp 65001 >nul title Redis Manager cd /d "%~dp0" :menu cls echo ========================================== echo Redis Manager on Windows echo 1) Start Redis (6379) echo 2) Check Status echo 3) Stop Redis echo 4) Exit echo ========================================== choice /c 1234 /m "Please choose :" if "%errorlevel%"=="1" goto start if "%errorlevel%"=="2" goto status if "%errorlevel%"=="3" goto stop exit /b 0 :start netstat -ano | findstr /C:":6379" >nul if not errorlevel 1 ( echo [Error] Port 6379 already in use. ) else ( redis-server.exe conf\redis.conf ) pause goto menu :status redis-cli.exe -p 6379 ping netstat -ano | findstr /C:":6379" pause goto menu :stop redis-cli.exe -p 6379 shutdown echo [OK] Redis stopped. pause goto menu

这段脚本里改用了choice命令来接收输入,按键1会得到errorlevel=1,按键2得到errorlevel=2,以此类�推,用起来比set /p手工输入更简洁。:menu和goto构成了简单的循环菜单,执行完一个功能后停一下,回车再回到主菜单。

status部分我故意放了两条命令:先是redis-cli ping验证服务是否响应,再netstat看端口监听状态。两者结合才能判断“Redis进程是否存在”和“Redis是否真正可用”。stop部分走redis-cli shutdown优雅关闭,比直接taskkill杀进程要温柔得多。

4. 脚本之外的运维细节:端口占用、多实例与可视化验证

脚本能给日常启动带来很大便利,但真正在项目里用起来,还有几个脚本之外的细节值得掌握。

4.1 端口6379被占用的完整排查链路

bat脚本里有一行端口检查,但脚本只能告诉你“端口被占了”,不能告诉你是谁占的。手动排查的完整链路是这样:

netstat -ano | findstr /C:":6379"

这条命令会输出类似这样的内容:

TCP 0.0.0.0:6379 0.0.0.0:0 LISTENING 12364

最后一列12364就是占用该端口的进程PID。拿到PID之后再确认它到底是谁:

tasklist | findstr /C:"12364"

如果输出显示是redis-server.exe,那多数是之前启动Redis时留下的进程,可以放心处理;如果不是redis-server,比如是个未知程序,那就别乱杀了,先查清楚再决定。

清理Redis残留进程,常用两种方式。如果只是停一个实例,用redis-cli shutdown最优雅;如果进程已经异常、shutdown命令都连不上,那就只能:

taskkill /F /PID 12364

注意,如果机器上同时开了多个Redis实例,按进程名taskkill /F /IM redis-server.exe会把所有Redis全杀掉,所以能按PID就按PID杀。在PowerShell里也可以用Get-NetTCPConnection -LocalPort 6379 | Select OwningProcess拿到PID,效果一样,喜欢用哪个看个人习惯。

4.2 多实例怎么管理:多份配置 + 多个bat

开发过程中经常会同时起两个项目,一个用6379,一个要用6380,这就是Redis多实例场景。做法并不复杂:

  • 复制一份配置,改名为conf\redis-6380.conf;
  • 把配置文件里的port改成6380;
  • 把dir改成D:/redis/data6380,避免两个实例写同一个数据目录;
  • 再复制一个bat,把配置文件参数指过去。

如果不想复制一堆bat,可以在同一个bat里支持参数,脚本启动时指定配置文件:

@echo off cd /d "%~dp0" title Redis Server if "%~1"=="" set "CONF=conf\redis.conf" if not "%~1"=="" set "CONF=%~1" echo Using config: %CONF% redis-server.exe "%CONF%" pause

用法就变成了:

start-redis.bat start-redis.bat conf\redis-6380.conf

不传参数默认6379,传了参数就用对应的配置。唯一要提醒的是,每个配置文件里logfile、dir、pidfile这些路径型参数都要各自独立,不然两个实例虽然端口不同,但日志和数据全都写在同一个地方,时间长了完全没法排查。

4.3 启动成功怎么验证:cli加可视化客户端

启动成功与否,最直接的办法就是客户端连一下。

redis-cli.exe -p 6379 ping

返回PONG就说明服务端活着。再进一步可以set一个key测读写:

redis-cli.exe -p 6379 set hello world redis-cli.exe -p 6379 get hello

能看到world就说明整套链路是通的。

如果你更习惯图形界面,Windows下有不少Redis可视化客户端可以选择,老牌的Redis Desktop Manager(RDM)、Redis官方的Redis Insight,还有开源社区维护的Another Redis Desktop Manager,连接方式都是填127.0.0.1和6379端口就行。需要注意,如果你的redis.conf里bind的是127.0.0.1,那么只有本机能连,局域网内其他电脑是连不上的。想给局域网内其他机器访问,需要把bind改成0.0.0.0,同时设置requirepass。这里我必须多说一句:bind 0.0.0.0意味着监听所有网卡,如果这台Windows机器暴露在公网上,Redis又没有密码,等于把数据库裸奔给全世界,这是绝对不能接受的。局域网调试可以,公网开放坚决不做。

5. 实测踩坑记录:编码、路径、反斜杠和消失的窗口

写bat这事看着简单,实际踩过的坑还真不少。我把最常见的几类记录下来,都是排了很久才找到原因的。

5.1 bat文件中文乱码:编码格式的锅

我在脚本里写了中文提示,第一次双击发现cmd窗口里全是乱码。原因是Windows下cmd默认代码页和文本编辑器保存的编码不一致:简体中文Windows默认使用GBK(代码页936),而现代编辑器比如VS Code默认保存为UTF-8。

解决办法有两个方向。

第一个方向:把bat保存为ANSI编码。在Windows记事本里点“另存为”,编码下拉框选“ANSI”即可。这样cmd用GBK解码中文,显示正常。

第二个方向:保留UTF-8编码,在脚本第一行加:

@echo off chcp 65001 >nul

把代码页切到UTF-8,并且文件必须存为无BOM的UTF-8。

实测下来,我自己的建议是“能用ANSI就用ANSI”,最省心。如果你打算把脚本传到Git上给其他人一起用,中文提示还是换成英文更稳,避免每台机器编码习惯不同导致乱码。

5.2 redis.conf存成了redis.conf.txt

这个坑尤其隐蔽。Windows资源管理器默认不显示文件扩展名,你新建一个文本文件然后重命名成redis.conf,看着文件名没问题,实际上它还是redis.conf.txt。bat里写的redis-server.exe redis.conf根本找不到这个配置文件,但Redis正常情况下端口6379一样起得来——用的是Redis的默认配置而非你的配置,于是经常出现“我明明改了端口/密码,怎么不生效”的怪现象。

解决办法是到资源管理器“查看”里勾选“文件扩展名”,确保实际文件扩展名是conf而不是txt。也可以用命令行目录列表确认:

dir /b *.conf*

看到的是redis.conf还是redis.conf.txt,一眼就清楚了。这个坑不涉及什么高深技术,但出现频率相当高。

5.3 配置文件的路径反斜杠问题

Redis配置文件里dir和logfile的路径写法,在Windows下有一个非常容易踩的坑。假设你在redis.conf里写:

dir "D:\redis\data"

启动时Redis不会立刻报错,但执行RDB保存的时候,可能会提示打不开文件、目录不存在,或者生成一堆诡异目录。原因在于Redis配置解析器会把反斜杠当作转义字符,比如\r就会被理解成回车,路径自然就乱了。

正确写法是用正斜杠,或者双反斜杠:

dir "D:/redis/data" dir "D:\\redis\\data"

同理,logfile的路径也建议统一用正斜杠。这类问题排查起来非常耗时间,因为启动日志通常不会直接告诉你是转义问题,只会让你觉得“目录明明建了怎么还说找不到”。我把这条放进来就是为了让大家绕开这个阴间坑。

5.4 关掉cmd窗口,Redis跟着没了

如果你在bat里直接跑redis-server.exe,这个进程是“前台进程”,和当前的cmd窗口绑定在一起。窗口一关,进程被系统回收,Redis就停止了。很多朋友一开始不理解这是为什么,其实它就是Windows控制台程序的标准行为,不是Redis的bug。

如果希望Redis不要跟窗口绑定,有两条路:

  • 把Redis装成Windows服务,服务运行在后台,和用户会话解耦,窗口关闭、用户注销都不影响;
  • 用start /min开一个最小化窗口启动Redis,但注意,最小化窗口一旦被关闭,Redis一样会停,只是看起来没那么碍眼而已。

基于这个特性,我反而觉得“关窗口即关Redis”在调试阶段是个优点——你不再需要额外去杀进程,关了窗口它就是停了,干净利落。

5.5 杀软误报和防火墙弹窗

还有两类环境层面问题。一是部分第三方杀软会把redis-server.exe当作可疑程序拦截或隔离,这个常见于从网上下载的zip包,由于exe没有数字签名,杀软容易误判。解决方式是加白名单,但我也会建议只从信誉度高的仓库下载Redis。

二是Windows防火墙弹窗。如果你把bind改成了0.0.0.0,首次启动Redis时系统会弹“是否允许访问网络”;如果当时点了取消,局域网内其他机器就连不上6379端口。本地回环访问127.0.0.1一般不会触发这个弹窗。出现“本机能连、局域网不能连”的情况,优先去防火墙里检查一下6379是否被放行。

6. 再进一步:从bat到Windows服务,什么时候该换

bat终究是一种“人工介入”的启动方式。当Redis需要作为常驻进程每天开机就在那跑的时候,就该考虑把它做成Windows服务了。

6.1 把Redis装成服务的标准命令

Redis的Windows发行版自带服务管理命令,不需要额外工具。用管理员身份打开cmd,进入Redis目录,执行:

redis-server.exe --service-install "D:/redis/conf/redis.conf" --service-name Redis6379

安装成功后启动服务:

redis-server.exe --service-start --service-name Redis6379

后面还有几个常用命令:

redis-server.exe --service-stop --service-name Redis6379 redis-server.exe --service-uninstall --service-name Redis6379 sc query Redis6379

这里有一个很关键的点:--service-install后面跟的配置文件路径,强烈建议写成绝对路径。因为服务启动时工作目录不一定是Redis目录,如果你写的是相对路径conf\redis.conf,服务会找不到配置文件,Redis将用默认配置启动,最终表现就是“明明改了密码,服务模式的Redis怎么不生效”。这个坑我踩过一次,后来所有服务相关命令一律写绝对路径,再没出过问题。

如果之前已经用bat启动过Redis,装服务之前先把bat那边的进程停掉,否则两个进程同时监听6379端口,服务自然起不来。

6.2 bat和服务两种模式怎么选

以我实际使用的经验来看,选择并不困难,按场景分就好。

使用场景推荐方案
本地开发临时起一个Redis调试bat
学习Redis、做实验、反复改配置bat
项目常驻后台、重启电脑自动运行Windows服务
团队协作,每个人都要快速起Redisbat + 提交到代码仓库
一台机器同时跑多个Redis实例多个bat,或者多个独立服务名

我不太推荐的做法是“把最小化窗口挂在后台好几周”,看起来好像是常驻,实际上一旦误关窗口Redis就没了,而且没人知道Redis到底开着没,排查问题的时间成本很高。既然要常驻,就老老实实装服务;既然只是调试,就用bat。

6.3 我现在的使用习惯

写了这么多年bat脚本,我最满意的一点是它把“启动Redis”这件事变成了零心智负担的操作。我现在每个项目的scripts目录里都放着两个文件:start-redis.bat和stop-redis.bat,直接提交到Git仓库。同事新克隆项目后,不需要知道Redis装在哪个目录、配置文件在哪里,双击两个脚本就能完成启动和停止。改配置测试的时候用bat跑前台,日志实时滚在窗口里;真正要长期跑的项目,再评估是否转成Windows服务。这个组合到现在用得很顺手,也没再出现过“启动失败却看不出原因”的情况。

如果这篇文章里哪个脚本或者配置模板能帮你省下几分钟的折腾时间,那它就没白写。你的Windows环境下可能还会有版本差异带来的小问题,但排查思路是不变的:先确认环境,再检查配置,最后看脚本输出。祝顺利。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询