ARTICLE DETAIL

资讯详情

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

Windows下用Bat脚本管理Redis:一键启动、配置运维全攻略

Windows下用Bat脚本管理Redis:一键启动、配置运维全攻略 在Windows上跑Redis是不少后端开发、测试和运维人员都绕不开的场景。虽然Redis官方早就不提供长期维护的Windows版本但公司里的测试机、自己的开发机总免不了是Windows系统。临时要起一个Redis实例做缓存验证、复现线上问题或者给同事搭一套联调环境这时候手边有一个能双击就启动的bat命令文件会比什么都管用。这篇文章就来聊聊怎么在Windows系统下把Redis的启动封装成一个bat脚本让它带着固定的配置、合适的参数一键跑起来顺带解决端口被占用、窗口闪退、连不上服务这些高频问题。内容适合想在Windows上本地跑Redis、又不想每次手动敲一堆命令的开发者也适合需要在多台Windows机器上快速部署Redis测试环境的同学。顺便说一句这套思路同样能套用到Elasticsearch、Docker等其它服务上原理都是相通的。1. 为什么我在Windows上选择用bat启动Redis先说说背景。我见过不少同事跑Redis的方式很原始打开Redis目录双击redis-server.exe完事。这样确实能启动但问题也明显——每次都得定位到目录且完全依赖默认配置。换个端口、加个密码、调整持久化策略全都得靠临时口口相传的命令来凑新来的同学根本不知道昨天那个Redis是怎么跑起来的。后来我养成了一个习惯把Redis的启动动作封装成bat文件放进目录谁要用直接双击配置跟着文件走环境坏了重拉一个也很快。这里先讲清楚两个关键选择你才知道为什么最终落在“bat”这个方案上。1.1 Redis的Windows版本怎么选Windows上没有官方长期维护的Redis安装包所以动手之前得先把“Redis for Windows”的版本渠道搞清楚。我实测过几种来源简单做个对比来源版本特点推荐度微软存档的Redis3.x官方曾与微软合作维护已停止更新不推荐太老tporadowski/redis5.0.14GitHub上很流行的Windows移植版解压即用推荐Redis官方Windows测试包6.x / 7.x官方推出的Windows实验性构建可尝试Memurai兼容Redis命令商业支持的Windows原生Redis替代品看需求我个人的结论是日常开发和本地测试用tporadowski的5.0.14版本最稳。原因很简单Windows移植版对官方C源码的跟进本身就有滞后5.x在各路业务里经过大量验证核心API和数据结构命令与新版几乎没有差别。你本地验证好的逻辑部署到Linux环境照样能跑。版本追得太新反而容易遇到Windows专属的编译问题。下载下来是zip压缩包解压到一个纯英文路径即可比如D:\Redis。解压后你能看到redis-server.exe、redis-cli.exe、redis-benchmark.exe和redis.windows.conf核心文件都在不需要安装也不需要装什么运行库这就是RedisWindows版最香的特性——绿色免安装。1.2 bat启动与手动启动、服务化启动的取舍有人可能会问双击exe已经很省事了为什么还要套一层bat我做个对比你就有体感了启动方式优点缺点手动双击redis-server.exe最直接参数靠默认配置不可复制新环境要重新摸索bat脚本启动参数固化、可复制、可传给同事本身不会做进程守护窗口退出Redis就停注册Windows服务开机自启、后台运行、不依赖窗口配置改动麻烦调试不直观需要管理员权限手动双击的方式适合“我就临时起一下看看”但你无法把配置固化下来。注册Windows服务适合长期挂机的场景比如某台Windows服务器要常驻Redis给内部系统用但每次改配置还得停服务、改配置文件、再启动用来开发调试确实钝。bat脚本正好卡在中间参数和配置全部固化在一个文件里双击就能启动发到群里同事们立刻能用还能顺手把启动日志一并处理。所以日常开发和测试环境我的首选就是bat。真要到7×24小时生产环境还是建议上Linux或者至少在Windows里走服务化这是后话。2. 编写bat启动脚本的核心细节确定了方案下面进入实操。这一章是全文的核心我会把bat文件从最简版一步步讲到可以直接抄作业的版本每一行的用意都说清楚因为你以后一定会改路径、改端口、改成自己的配置。2.1 最小的启动脚本先看一个最简单但能用的脚本echo off set REDIS_HOMED:\Redis cd /d %REDIS_HOME% redis-server.exe redis.windows.conf pause这个脚本干的事很清楚进入Redis目录用指定的配置文件启动服务。但里面的几个关键字如果你是新接触bat特别容易踩坑我逐个拆开讲。echo off关闭命令回显。不加这一行黑窗口里会先把每条命令原文打出来再打执行结果乱糟糟一片无关紧要但影响观感。set REDIS_HOMED:\Redis定义一个变量。我习惯把Redis目录抽出来后面所有地方引用%REDIS_HOME%。以后目录换了只改这一行就够不用全文翻着改。cd /d %REDIS_HOME%进入指定目录。这里/d参数特别关键它的作用是“同时切换盘符和目录”。bat默认只在当前盘符下跑如果Redis放在D盘而你执行时在C盘不加/d就会切不过去然后后面那句redis-server.exe就会提示“不是内部或外部命令”。redis-server.exe redis.windows.conf真正启动Redis的命令指定了配置文件。你在网上下的压缩包里可能还有redis.windows-service.conf那个是给Windows服务用的我们本地bat启动用的是redis.windows.conf。pause执行完停住等待按任意键继续。这行的作用是保底如果Redis因为配置错误或端口占用直接崩了命令窗口不会瞬间消失你能看到报错信息。这是排查问题的第一道防线。把脚本保存成start-redis.bat注意保存时编码选ANSI这个后面会细讲。双击运行看到窗口里打印出带版本号的Redis logo最后出现Ready to accept connections就说明启动成功了。2.2 把参数和配置拆分开启动Redis时有两条路一条是把参数直接写在命令行后面比如redis-server.exe --port 6380 --requirepass 123456另一条是全部写进配置文件。我强烈推荐后者理由有两层第一命令行参数没法写注释端口为什么用6380、密码为什么设这个值过两周你自己都未必记得第二配置文件可以跟着bat一起分发团队里新同学拿到就能用不用听你口述历史操作。redis.windows.conf里面每一项都有注释你不需要全看懂开发调试场景重点关注这几个参数配置项默认值作用port6379Redis监听端口bind127.0.0.1允许哪些IP连接默认只允许本机protected-modeyes保护模式非本机访问且没设密码时会被拒requirepass空访问密码maxmemory0不限制Redis最大可用内存超过后按淘汰策略清理appendonlyno是否开启AOF持久化save900 1 300 10RDB快照触发条件我平时在Windows本地调试时常用的一份配置长这样port 6380 bind 127.0.0.1 protected-mode yes requirepass 123456 maxmemory 256mb appendonly yes appendfsync everysec端口用6380而不是默认6379是为了避免和本机已经存在的Redis实例冲突也提醒自己这不是“默认配置的Redis”。requirepass设一个简单密码防止局域网里的其他人扫到端口就随便连进来。maxmemory限制到256mb避免开发环境里有人写了死循环一样的代码往里灌数据把整块磁盘写满。appendonly yes开了AOF这样不小心重启Redis数据也不会丢得干干净净。配置文件里还有一项值得注意daemonize no。这是一个常见大坑——在Windows版Redis里这个参数不要改成yes因为Windows移植版不支持真正的后台守护进程模式。你一旦改成了yes很可能遇到redis-server启动后窗口一闪就没了但服务其实还在跑的情况管理起来非常别扭。bat启动方案里就让它前台跑着日志直接打在窗口里反而直观。修改完配置文件记得保存然后在bat里的启动命令不需要带任何参数因为它会自动读取redis.windows.conf。以后调试不同端口、不同密码的实例我通常是复制一份配置文件比如redis-6380.conf再改bat里的文件名一套配置跟着一个实例走互不干扰。2.3 再加几个辅助bat客户端、压测启动只是第一步日常用得最多的还有两个动作连上Redis敲命令、给Redis做压力测试。把这两个动作也封装成bat就凑齐了一套最小工具箱。连接客户端的脚本cli.batecho off cd /d D:\Redis redis-cli.exe -p 6380 -a 123456 pause这里两个参数的用意是-p 6380指定端口和前面的启动配置保持一致-a 123456是启动时自动带密码认证。如果你不想每次连接时密码都出现在命令历史里比如在共享机器上也可以去掉-a参数进到redis-cli交互界面后再输入AUTH 123456效果一样。这个细节属于“安全洁癖”看场景取舍。压力测试脚本bench.batecho off cd /d D:\Redis redis-benchmark.exe -h 127.0.0.1 -p 6380 -c 100 -n 10000 -d 128 -t set,get pause-c 100代表100个并发连接-n 10000代表总共发10000条请求-d 128代表每个Value的大小是128字节-t set,get代表只压测Set和Get两种命令。跑完之后窗口里会直接打印出每秒请求数和延迟百分位不用自己造数据就能快速感知这台机器的Redis性能基线。这三件套我命名为start-redis.bat启动、cli.bat连接、bench.bat压测全部丢在D:\Redis目录下。团队里谁需要把整个目录打包发过去就行解压即用没有安装成本。3. 进阶从“能启动”到“好管理”能把Redis启动成功只是及格线。真正用起来你会发现窗口管理、环境变量、开机自启这些话题很快就浮出水面。这一章讲的都是我在实际使用中从“能用”到“好用”的过渡经验。3.1 窗口标题和后台运行的技巧默认情况下redis-server启动后的黑窗口标题叫D:\Redis\redis-server.exe看多了很乱而且如果你同时起了两三个Redis实例根本分不清哪个窗口对应哪个端口。解决办法是加一条title命令echo off title Redis 6380 instance cd /d D:\Redis redis-server.exe redis-6380.conf pausetitle命令直接设置当前窗口标题。窗口一多扫一眼标题栏就知道哪个是哪个这算是我自己很受用的小习惯。另一个需求是“窗口最小化启动”。有时候不想让那个黑窗口占着整个任务栏但又不想彻底后台运行毕竟日志还在窗口里。可以用start命令echo off cd /d D:\Redis start Redis 6380 /min redis-server.exe redis-6380.confstart后面第一个字符串是“窗口标题”必须写在引号里这一点新手极容易漏。如果漏了start会把它当成要执行的文件名然后系统弹一个找不到文件的报错。/min表示最小化启动新窗口。运行之后任务栏会出现一个最小化的窗口Redis在后台跑着想看日志就点开它。有一点我得提醒不建议用start /min配合一个“额外开的正常窗口”这种花活也不要尝试把Redis完全藏到后台然后靠redis-cli去访问。Redis在Windows移植版里就是前台应用你就当它是个需要独立窗口的服务。开发调试期让日志可见等于给自己留了一条排查后路。3.2 沾环境变量一次性局部注入更靠谱还有一类做法是“把Redis目录写进Windows系统PATH”然后bat里只写redis-server.exe不带路径。看着清爽但我不推荐这么搞。全局PATH一旦加了Redis目录会产生两个麻烦第一如果机器上同时装了多个Redis版本PATH里的搜索顺序会让“对的那个”被忽略你明明想启动新版本调用的却是老版本。第二全局环境变量改一次所有开着的终端窗口都得重启才生效排查问题多一层干扰。我推荐的方案是“局部注入”只在bat进程内部临时扩展PATHecho off set PATHD:\Redis;%PATH% cd /d D:\Redis redis-server.exe redis-6380.conf pauseset PATHD:\Redis;%PATH%的意思是把D:\Redis拼到当前窗口环境变量PATH的最前面仅对当前bat进程生效不污染系统全局设置。这样既能省去反复写绝对路径的啰嗦又不会影响机器上其它软件。以后这个bat传到任何机器只要预先设置好REDIS_HOME或者改动第一行路径就能继续用。3.3 把Redis注册成Windows服务做到开机自启如果你希望Redis在Windows机器上常驻运行重启不慌那就别用bat了直接注册成Windows服务。这里提供的思路分两条路径一个是系统自带的sc命令一个是第三方工具NSSM。先用sc命令演示注册和启动sc create Redis6380 binPath D:\Redis\redis-server.exe D:\Redis\redis-6380.conf start auto net start Redis6380注意sc create语法里binPath后面必须跟一个空格再接引号start也是一样。这是sc命令的经典坑等号和值之间缺了空格命令会直接报参数错误。创建成功后可以用net start Redis6380启动服务也可以在服务管理器里看到这个服务。但说实话用sc直接包装Redis有个缺陷没法做进程守护和日志重定向。Redis要是崩了服务直接就停了没有重启机制。所以我更推荐NSSMNon-Sucking Service Manager这个工具就是专门干“把普通程序变成Windows服务”的使用体验比sc舒服得多。nssm install Redis6380 D:\Redis\redis-server.exe D:\Redis\redis-6380.conf nssm start Redis6380NSSM的优点有三个一是自带日志重定向能把redis-server的stdout和stderr写到文件里方便事后翻日志二是支持进程退出后自动重启相当于给了Redis一个简单的守护机制三是配置界面直观nssm install会弹出一个图形化窗口Application路径、Arguments、启动目录这些一目了然不需要记命令参数。所以我的建议是Windows上要做的“服务化”优先考虑NSSMsc可以作为了解系统底层服务机制的一个入口。4. 常见问题与排查技巧实录这一章写的都是我自己踩过的坑。bat启动Redis这事看起来简单但新手的热情通常不是被复杂原理打击的而是被“窗口闪退”“连不上redis-cli”“端口被占用”这三座大山压垮的。我把最典型的问题、排查思路和解决命令整理出来你遇到了能少走很多弯路。4.1 bat双击闪退窗口瞬间消失双击bat窗口一闪而过这是最劝退的场景。90%的原因是Redis进程因为配置错误、路径不存在或者端口被占直接退出了而窗口又被系统立刻关闭你根本看不到错误信息。我自己第一次写启动脚本时就是因为目录写错闪退到怀疑人生。第一步别双击先在CMD里手动执行。打开cmd切换到你文件所在的目录手动敲一行redis-server.exe redis.windows.conf所有报错都会停留在屏幕上你就能看到真正的死因。第二步给bat加前置校验。一个成熟点的启动脚本长这样echo off set REDIS_HOMED:\Redis if not exist %REDIS_HOME%\redis-server.exe ( echo [ERROR] Redis not found in %REDIS_HOME% pause exit /b 1 ) cd /d %REDIS_HOME% redis-server.exe redis.windows.conf pauseif not exist检测Redis主程序是否存在不存在就输出错误提示然后pause停住exit /b 1返回一个非零错误码方便后续脚本里判断是否成功。这一步做好闪退问题至少能解决一半。4.2 端口被占用绑定6379失败“端口绑不上”是Redis启动失败的另一个高频原因。如果你之前跑过一次Redis没关干净或者本机装了别的软件占了6379/6380端口启动日志里会出现类似bind: Address already in use的字样然后进程自动退出。排查和清理手段就两条命令netstat -ano | findstr 6380 taskkill /PID 1234 /Fnetstat -ano列出所有端口占用情况findstr 6380只过滤出和6380相关的行-o参数是关键它会在结果最后列出一列PID这个PID就是占用端口的进程号。拿到PID后taskkill /PID 1234 /F强制杀掉进程再重新启动Redis就能绑上端口了。注意不要不看PID就乱杀。有时候占着端口的根本不Redis可能是其它程序。更稳妥的方式是先用tasklist | findstr 1234确认这个PID对应的进程名是什么确认了再杀。开发测试机上也许无所谓但在内部共用的服务器上误杀别人的进程总是不太好。4.3 redis-cli连不上Connection refused / DENIED Redis服务看似起来了但用redis-cli连接访问不通通常就三种情况。第一种是服务本身没起来。窗口里报Connect refused先去执行bat的窗口看是不是Redis进程已经退了顺着4.1的排查思路走。第二种是服务起来了但配置了bind 127.0.0.1和protected-mode yes。本机能连局域网里其它机器连不上。如果你只想本机开发调试这是正常且安全的。如果你确实要让别的机器访问就得改配置里bind为0.0.0.0或者改成实际网卡IP同时protected-mode no并且一定要设置requirepass密码。这个组合是最低安全要求。第三种是密码没输对。如果你启用了requirepass连接时没有认证就执行命令Redis会返回NOAUTH Authentication required。这时候得用带认证的登录方式redis-cli.exe -p 6380 -a 123456 ping如果返回PONG说明服务正常、认证正常。这个ping命令是排查的“探针”非常值得记心里。以后再遇到连接问题先ping一下能把问题范围直接缩小一大半。4.4 bat文件本身的坑编码、路径空格、pause位置最后是三个文件层面的细节全是我当年踩过的实坑。第一中文乱码。Windows的批处理文件默认按ANSI/GBK编码解析如果你用现代的编辑器比如VS Code写bat默认保存格式是UTF-8里面一旦出现中文注释或中文提示运行时就是一堆乱码。解决方式很简单要么bat文件里不写中文全部用英文注释要么工具保存时选择ANSI编码要么在文件开头加上chcp 65001把当前控制台代码页切到UTF-8再配合UTF-8保存的脚本才能正常显示中文。第二路径带空格。如果Redis装的路径是C:\Program Files\Redis这种含空格的bat里调用程序时必须加引号否则系统会把路径拆成两段报“不是内部或外部命令”。比如C:\Program Files\Redis\redis-server.exe C:\Program Files\Redis\redis-6380.conf不仅仅是程序路径配置文件路径也一样要加。这个毛病我在给一台装了Redis到Program Files的机器写启动脚本时吃过亏排查了半天才发现是路径空格问题。第三pause的位置。很多新手把pause放在启动命令之前或者漏写。放之前会导致Redis还在启动脚本就停住等你按键毫无意义漏写则窗口闪退看不到报错。正确的位置就是脚本最后一行的后面因为bat是逐行执行的启动命令执行完、Redis进程退出或者报错后才会往下走到pause这时候停住才能看到关键信息。5. 趁手好用的Redis日常运维脚本到这里启动问题基本解决了。但Redis的使用不只有“启动”这一件事。我用bat封装的最高频操作还有三个一键关闭、定时清理、配合可视化客户端。把它们整理成脚本日常运维负担能降下来不少。5.1 一键关闭全部Redis进程之前拉起的Redis实例用完后要关掉一个个去窗口叉掉不优雅也不一定关得干净。我写了一个stop-redis.batecho off echo 尝试关闭所有 Redis 进程... taskkill /IM redis-server.exe /F nul 21 if %errorlevel% equ 0 ( echo Redis 进程已停止 ) else ( echo 未发现正在运行的 Redis 进程 ) pausetaskkill /IM redis-server.exe /F按映像名称强制结束所有Redis进程。nul 21把正常输出和错误输出都丢弃避免刷屏。然后用%errorlevel%判断上一条命令的返回值0代表成功杀到进程非0代表没找到目标进程。这里要提醒一句按映像名称杀进程会把机器上所有Redis实例全部停掉。如果你同时开了多个不同端口的Redis只想关某一个那就别用这个脚本改用前面说的netstat查PID再精准杀。我自己的使用场景基本是“全部关掉然后重新拉一套环境”所以映像名称方案够用了。5.2 定时任务配合bat缓存治理小实战有一类需求很常见缓存里堆积了很多无效key想每天自动清理一次或者Redis内存不断上涨想定期做一次手动淘汰。Windows自带的“任务计划程序”配合bat就能轻松实现。我举一个简单但也实用的例子批量删除所有以temp:开头的key。echo off cd /d D:\Redis redis-cli.exe -p 6380 -a 123456 --scan --pattern temp:* temp_keys.txt for /f delims %%i in (temp_keys.txt) do ( redis-cli.exe -p 6380 -a 123456 del %%i nul 21 ) del temp_keys.txt echo 清理完成 pause脚本逻辑不复杂先用--scan --pattern temp:*查出所有匹配的key把结果写入临时文件再用for /f循环逐行读取对每个key执行del命令最后删除临时文件。这里特意用了--scan而不是KEYS temp:*是因为KEYS命令在大数据量时会阻塞Redis而--scan是迭代游标扫描不会长时间卡住服务。这个细节对线上环境很重要本地测试虽然差异不大但从一开始就养成好习惯总没错。写好后在Windows开始菜单搜索“任务计划程序”创建基本任务触发器选“每天”或“每周”操作选“启动程序”程序位置定位到这个bat文件。这样每天定时清理就自动化了。其实不只是清理key你还可以让任务计划程序定时执行启动脚本实现Redis的定时唤醒玩法很多但原理都是这一个。5.3 可视化客户端与命令行的配合命令行工具虽好但日常看Key列表、查看内存趋势、看某个Key的TTL还是图形化界面更直观。我用过不少Redis客户端近两年用得最多的是Another Redis Desktop Manager免费、跨平台、对中文用户友好Windows上直接下载安装版就行。官方也出了RedisInsight功能也很全。在连接配置里填上对应的IP、端口、密码就能看到整个实例的Key列表。但我也深有体会真到排查问题或做批量操作时命令行反而更快。比如想快速看某个Hash里所有字段命令行里一句hgetall user:1024就出来了客户端里还得展开Hash、一个个字段去看。所以我的习惯是日常监测交给图形客户端批量操作和精确调试交给bat工具箱里的redis-cli两条腿走路效率最高。另外顺带一提Redis的数据类型除了常见的String之外还有List、Hash、Set、ZSet、Bitmap等。封装bat脚本时如果涉及到数据类型相关的操作redis-cli的命令语法和Linux下完全一致不存在Windows专属差异。这个兼容性是我最满意的一点。6. 最后分享一点我自己的体会踩过几次坑之后我现在写bat的底线就三条路径全部写死并且加引号、关键命令后面带pause、凡是会清数据或杀进程的脚本先echo确认一遍。做到这三点这个bat工具箱基本就稳了传到哪个机器都能用。bat这个技术看起来确实有点“老派”但它恰恰是Windows环境里解决重复启动和管理问题的最低成本方案。不需要安装额外的软件不需要写复杂的脚本语言一个文本文件就能把团队里反复出现的操作固化下来。如果你手头也有一台经常要启动Redis的Windows机器建议现在就照着文中的脚本试一遍把属于你自己的那套工具箱建起来。
返回列表