多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Windows和Linux下查看Redis版本号的完整指南

Windows和Linux下查看Redis版本号的完整指南 经常有朋友问我在Windows上装了个Redis怎么查版本号到了Linux上命令好像又不一样。其实查看Redis版本号这件事本身不复杂但Windows和Linux的环境差异、安装方式差异会让一个本来三秒钟能解决的问题变得像踩迷宫。这篇文章就把我在Windows和Linux两种系统下查看Redis版本号的完整思路和实操命令都摊开讲包括为什么有时候命令一样有时候又不一样以及查版本号时容易踩的坑该怎么避开。不管你是刚接触Redis的开发新手还是需要维护服务器的运维同学都可以照着操作。1. 为什么需要关心 Redis 版本号1.1 版本号就是一张“能力清单”Redis的版本号通常由主版本号、次版本号、补丁版本号三段组成例如7.2.4。主版本号决定大的功能迭代次版本号带来新的命令和特性补丁版本号则主要修复已知问题。这一点看起来像是常识但实际工作中很多人把某个命令在网上搜到后就往生产环境里敲结果发现当前版本不支持就会收到ERR unknown command的错误。所以先查看版本号不动手就知道当前Redis支持哪些功能。比如Redis 6.0开始支持ACL访问控制列表和RESP3协议Redis 7.0引入了自动AOF重写等功能。如果公司还在用5.x版本那么这些新特性一概没有。反过来说有些旧版本的配置项在新版本中可能被移除或改名升级前确认版本也同样重要。我见过因为Redis版本不一致导致主从复制无法同步的案例最后排查下来是主库和从库的版本差别太大某些RDB文件结构不兼容。先确认版本号能在排查时省下几个小时。1.2 运维和开发都要先看版本对开发同学来说版本号决定了你写的代码里能不能放心使用某个命令和客户端库配置。比如Redis 7.0里部分命令的行为有变化处理超时或键空间通知时不同版本的表现可能不同。对运维同学来说版本号是判断是否需要紧急升级的关键依据Redis官方安全公告会明确影响版本范围你手上实例的版本是否在受影响区间只有实际查过才算数。我还遇到过这样的场景服务器上有两个Redis实例一个是6.2一个是7.0早期排查时只看了本机默认的redis-server -v确认是7.0后就以为所有实例都安全。后来连接业务实际使用的端口才发现另一个实例还在6.2并且命中了已知的严重问题。这就是只依赖一种查看方式、没有去确认运行实例版本带来的教训。所以下面我不会只给你一条命令而是结合环境把不同场景下的查看方式都整理出来。像这种“多个实例版本不一致”的问题我在日常运维里碰到过好几次每次都靠重新确认端口和版本这个动作避免更大的事故。2. Windows 系统下查看 Redis 版本号的几种方法2.1 最简单直接redis-server --versionWindows下Redis的安装方式和Linux不太一样。通常你会下载一个zip压缩包解压后得到redis-server.exe、redis-cli.exe等文件一般不提供系统服务安装向导。在这个常见情况下查看版本号最直接的方法是打开cmd或PowerShell进入解压目录然后执行redis-server.exe --version或者使用短参数redis-server.exe -v实际输出类似Redis server v6.2.7 sha00000000:0 mallocjemalloc-5.1.0 bits64 build9a4d5e4b注意我这里用的是redis-server.exe不是redis-server。Windows下的可执行文件如果没加.exe前缀在PATH环境变量未配置时可能会提示找不到命令。如果你已经把解压目录加入系统PATH那么命令可以去掉.exe后缀。但为了稳妥我建议还是把后缀带上这样别人看到你执行的内容也能知道你用的是Windows原生的Redis版本。还有一个很常见的问题很多人拿到zip后直接双击redis-server.exe结果弹出一个黑色窗口然后一闪而过或者窗口一直停在那里以为是卡住了。其实那是因为Redis默认在前台运行意味着这个窗口就是服务进程不能随便关关掉服务就停了。你如果要查看版本号不应该靠双击后的界面应该在命令行里执行上面的命令。等命令输出完进程会直接退出不会占用终端。2.2 实例运行中用 redis-cli 查看 INFO server如果Redis已经启动并且你需要确认的是正在运行中的实例版本上面redis-server --version 的方式虽然能看出二进制文件的版本但如果你启动了多个实例或者你拿到的exe版本和实际运行中的版本不一致它就不够准确。这时候更靠谱的方式是用客户端连接进去查看服务端上报的版本信息。在Windows命令行下执行redis-cli.exe -h 127.0.0.1 -p 6379 info server返回信息里面有一行redis_version:6.2.7如果你只想快速看到版本行可以在cmd里用redis-cli.exe -h 127.0.0.1 -p 6379 info server | findstr redis_versionPowerShell用户则需要用Select-Stringredis-cli.exe -h 127.0.0.1 -p 6379 info server | Select-String redis_version区别只在于管道命令不同。我平时更推荐直接执行完整info server因为除了redis_version还能看到redis_mode、os、uptime_in_days等字段对判断实例状态也有帮助。多看一行信息不亏。2.3 服务化安装后的版本定位部分团队在Windows服务器上会把Redis注册成Windows服务让它在后台自动启动。这时你想查版本可以先看服务的属性。在管理员权限的cmd里执行sc qc redis或者打开服务管理器找到Redis服务查看其“可执行文件的路径”。拿到路径后在命令行对那个具体的exe执行--version即可。比如路径是C:\tools\redis\redis-server.exe就执行C:\tools\redis\redis-server.exe --version这里有个细节注册服务时有些工具会把redis-server.exe复制到另一个目录或者使用一个包装程序来启动比如WinSW或NSSM。这时候查看服务路径比搜索整个C盘更快。不要凭记忆觉得“我装在D盘就一定是那个目录”服务实际调用的可执行文件必须从服务配置里确认。这也是我在帮别人排查问题时遇到过的情况明明环境变量指向A目录服务却用的是B目录里的老版本这会导致你看到的版本号和实际服务运行的版本号完全对不上。2.4 WSL 和 Docker Desktop 的版本查看现在很多Windows开发者已经不用原生Redis了而是用WSLWindows Subsystem for Linux或Docker Desktop。如果你在Windows 10/11上装了WSL并在WSL里通过apt安装了redis-server那么查看方式就和Linux基本一致。启动WSL终端后执行redis-server --version如果通过Docker来跑Redis镜像假设容器名称是redis那么执行docker exec redis redis-server --version或者进入容器后用redis-cli查询docker exec -it redis redis-cli info server这里需要提醒的是在Windows上用原生Redis和用WSL/Docker里Redis版本可能完全不同。你甚至可能同时装了三种Redis如果不能确定业务使用的是哪一个最后查出来的版本号就不能代表业务模块的实际Redis版本。动手之前先想清楚Redis跑在哪里这个优先级比命令本身更高。3. Linux 系统下查看 Redis 版本号的常见姿势3.1 命令带路径时直接查Linux下Redis的安装来源很多最常见的三种通过系统包管理器安装比如apt install redis-server、通过官方源码编译安装、直接使用发行版仓库里的redis包。第一种安装完成后redis-server和redis-cli一般会被放进/usr/bin或/usr/local/bin所以直接在终端执行redis-server --version就能看到类似下面的输出Redis server v7.0.12 sha00000000:0 mallocjemalloc-5.1.0 bits64 build4c9a3a2d如果你只想快速拿到版本号也可以配合grep或awk但实际没必要因为--version输出很短一眼就能看清。相比之下redis-cli的版本输出可能略有不同比如redis-cli --version输出可能是redis-cli 6.2.7注意redis-server --version显示的是服务端程序的版本redis-cli --version显示的是客户端工具的版本。两者可能不一样尤其在只用包管理器单独安装过redis-tools的情况下。这个坑值得记住因为很多人会下意识认为两个输出应该完全一致。3.2 命令不在 PATH 时怎么定位源码编译安装的Redis默认会被安装到/usr/local/redisbin目录下的可执行文件未必被加入PATH。你执行redis-server -v时可能得到bash: redis-server: command not found。这时候有两种定位方式通过进程找路径和通过文件系统搜索。找到正在运行的进程路径最直接ps -ef | grep redis-server输出中往往能看到类似 /usr/local/redis/bin/redis-server 0.0.0.0:6379 这样的信息然后你直接用这个绝对路径执行--version/usr/local/redis/bin/redis-server --version如果进程没在运行再用find搜索find / -name redis-server -type f 2/dev/nullLinux系统里find全盘搜索可能会提示权限不足不过2/dev/null把错误消息丢弃掉依然能找出大多数情况。搜索到的路径可能不止一个比如系统里同时存在/usr/bin/redis-server和/usr/local/redis/bin/redis-server。这时要看哪个才是你业务里用到的那个不要随便挑一个就认为所有实例都是这个版本。3.3 远程实例没有 redis-cli 也能查需要查看的Redis如果不在本机可能是局域网内另一台服务器而你的机器上又没有redis-cli怎么办有两个思路一是用nc或telnet直接和Redis端口通信二是用任何一门语言的Redis客户端执行info server。我个人更倾向于用nc因为不需要装额外工具。Redis协议是文本协议在命令行下可以这样模拟printf INFO server\r\n | nc 192.168.1.10 6379返回的头几行就是Redis响应里面有redis_version字段。如果系统里没有nc可以试试telnettelnet 192.168.1.10 6379连接上之后输入INFO server回车同样能看到版本信息。这种方式不依赖redis-cli在排查问题时特别好用前提是Redis没有开启保护模式或者你发送的请求来源IP在白名单内。远程连接时建议用带认证的实例输入AUTH认证后再执行INFO避免被拒绝访问。其实这就是最原始的“协议级探测”理解了这个原理后面你再去看各种可视化客户端工具时就会发现它们底层做的事一模一样。3.4 Docker 容器里的 Redis 版本现在生产环境用容器部署Redis越来越普遍。如果你只知道宿主机上有Redis但不确定容器名称可以先用docker ps | grep redis找到容器名或容器ID然后执行docker exec container_name redis-server --version也可以进入容器后执行docker exec -it container_name sh进入后运行redis-cli info server | grep redis_version如果你是使用docker-compose启动的容器名通常在docker-compose.yml里定义用docker ps确认后执行即可。还有一点很多人忽略宿主机上安装的redis和容器里的redis是完全不同的两套程序如果搞混了版本信息自然也不对。所以我强烈建议凡是容器化部署的实例一律用docker exec进入容器查询不要用宿主机上的redis-server -v结果冒充。3.5 源码安装包的版本信息如果你是从Redis官网或GitHub下载的源码包在编译安装前其实也可以不用等到编译完再查看版本。解压tar.gz后进入源码目录就能从多个文件里看到版本号。比如执行cd redis-7.2.4更准确的方法是看源码目录名称一般就是redis-7.2.4这种格式。另外Redis源码根目录下的README.md开头通常会注明当前版本src/redis-server.c中也写有版本常量。如果你已经把源码编译到一半可以直接运行编译好的二进制src/redis-server --version这个输出最准确也最不容易出偏差。源码包方式适合那些“我只是从网上抄了一段安装命令但不确定能不能用”的场景。先看版本再决定要不要直接搭主从或做高可用配置能少走很多弯路。4. 版本输出里那些字段到底是什么意思4.1 典型输出逐段拆解不少同学第一次看到redis-server --version的输出会觉得每个字母都很眼熟但拼在一起就不知道什么意思了。我们拿一个典型的输出Redis server v7.0.12 sha00000000:0 mallocjemalloc-5.1.0 bits64 build4c9a3a2d逐段看v7.0.12Redis实际版本号。sha00000000:0构建时对应的Git提交哈希。从官方发布包编译时如果没保留Git元信息通常会显示全零。如果是自己用Git clone的源码编译这里会有具体提交ID方便你追溯到某次代码变更。mallocjemalloc-5.1.0Redis使用的内存分配器生产环境大部分是jemalloc也有libc或tcmalloc。这个字段在你分析内存碎片率时有点参考价值。bits64编译架构64位版本。32位版本对内存上限有天然限制所以看到这个字段可以顺手确认一下跑的是不是64位程序。build...构建ID每次源码的编译唯一生成可以用来精确指认一个二进制文件。理解这些字段以后你就不只是看到一串数字而是能通过输出判断这个Redis是不是官方发布、是不是64位、用什么分配器这些信息在做故障排查时都有用。4.2 客户端的版本和服务端的版本要分清redis-cli --version和redis-server --version返回的内容并不总是完全对应。如果你是在一台机器上单独安装了redis-tools这种客户端工具而服务端是从别的机器拉起来那么这两个版本很可能是脱节的。我遇到过最夸张的情况是客户端是6.x服务端是7.x大部分常用命令正常工作但当我用客户端发送某些新命令时Redis会报ERR unknown command因此我花了不少时间才定位到是客户端和服务端版本差异。其实大部分人日常不会直接用redis-cli去发命令更多是程序里的客户端库和服务端Redis交互。如果底层库的版本太老、不认识服务端新引入的协议特性也可能握手失败或出现奇怪行为。查看服务端版本时我建议统一以INFO server里的redis_version为准因为那是运行实例真正报告出来的版本比启动文件的版本号更可靠。只有在启动文件本身可疑比如有人替换了二进制但没有重启服务时才需要额外用redis-server --version做对比。5. 常见问题与排查技巧实录5.1 输入 redis-server -v 提示 command not found这是最普遍的问题。Linux下很可能是因为安装源码后没有把bin目录加入PATHWindows下则可能是解压目录没有被放进系统环境变量。解决思路不是马上去改全局PATH而是先用绝对路径定位能运行的程序。比如Linux下先跑一下find / -name redis-server -type f 2/dev/null找到路径后把它加到当前用户的.bashrc或.zshrc中或者创建软链接ln -s /usr/local/redis/bin/redis-server /usr/local/bin/redis-server ln -s /usr/local/redis/bin/redis-cli /usr/local/bin/redis-cliWindows下则把解压目录加入系统Path环境变量后重开命令行窗口即可。这里要注意改完环境变量后当前已经打开的终端不会立刻生效必须新开一个窗口。5.2 版本号拿到了但连接业务端口发现不一样一台机器上可能通过系统包安装了一个Redis又手工解压了一个Redis或者一个在6379端口一个在6380端口。你查看本机二进制版本只代表默认那个可执行文件不等于所有实例都是这个版本。正确做法是先用ss -lntp或netstat查看当前监听的Redis端口再逐个连接端口执行info serverfor port in 6379 6380; do redis-cli -p $port info server | grep redis_version done这个循环在排查多实例时非常高效。我在生产环境里用过很多次几乎每次都能发现有一两个实例的版本和其他实例不一致。版本不一致本身不算致命但主从架构中如果主库版本太新而从库版本太旧可能会出现RDB格式不兼容或复制命令参数不匹配的情况所以多实例环境下确认“每个端口对应什么版本”比只查一次更有价值。5.3 Windows 下双击 redis-server.exe 窗口一闪而过这个问题虽然不是“查看版本号”的直接动作但很多人在查版本时都会遇到。双击exe后窗口消失并不代表Redis没有启动而是因为Redis默认在前台运行如果它启动后正常监听端口窗口就会一直开着如果启动失败比如端口被占用或配置文件错误窗口会一闪而过并退出。因此在Windows上查看版本号或做调试应该养成用命令行的习惯。先cd到解压目录执行redis-server.exe --version确认版本再决定是否用redis-server.exe redis.windows.conf指定配置文件启动。尽量避免用双击的方式管理服务否则既看不到日志也容易产生端口冲突的错觉。5.4 需要跨机器批量确认版本时的小经验如果你管理的Redis实例比较多一台台登录查看比较费劲可以在能访问所有机器的跳板机上用ssh批量执行。比如把机器IP列表写进ips.txt然后循环执行for ip in $(cat ips.txt); do echo $ip ssh -o ConnectTimeout5 $ip redis-cli -p 6379 info server | grep redis_version done这个脚本依赖每台机器都能用redis-cli如果没有也可以用redis-server --version替代。需要注意的是这样批量执行只能拿到“默认命令”对应的版本如果有些实例用容器跑就必须在ssh命令里嵌套docker exec。我加超时参数就是为了防止某台机器SSH卡死导致循环挂起这个细节在批量操作时非常重要。5.5 场景速查表下面把常用场景和命令整理成一个表格方便以后直接翻。环境或场景推荐命令备注Windows原生安装redis-server.exe --version需要在解压目录或已加PATHWindows运行中的实例redis-cli.exe info server管道可用findstr过滤redis_versionLinux本机源码包安装/usr/local/redis/bin/redis-server --version以实际路径为准Linux运行中的实例redis-cli -p 6379 info server返回redis_version字段远程实例无redis-cliprintf INFO server\r\n | nc IP 6379也可用telnet替代Docker容器docker exec 容器名 redis-server --version必须先确认容器名Windows服务方式运行查看服务路径后对exe执行--versionsc qc 服务名查可执行路径这张表覆盖了绝大多数场景。实际上你只要记住一句话看版本号最终要落到“运行的实例”上二进制文件和运行实例不一定是一回事。这条原则在很多Redis问题排查里都适用。最后说一个我自己的习惯。接手一台新的Redis服务器时我会先执行redis-server -v确认二进制版本再马上连接实际业务端口执行info server确认运行版本两者一致才放心。如果遇到容器部署就改成docker exec和redis-cli的组合。这个习惯帮我避免过好几次“以为升级成功实际业务还在用旧实例”的尴尬。你先用这些方法把自己的环境查清楚再去看命令兼容性、主从同步这些更深的主题会顺手很多。
返回列表