☰
Redis 7.4.0离线安装实战:源码编译与生产配置指南
2026/10/3 3:04:38 网站建设 项目流程

1. 场景判断:什么情况下必须走离线这条路

我接手过不少生产环境的服务器,最头疼的往往不是Redis本身有多复杂,而是那台机器根本碰不到外网。等保要求、内网隔离、专网环境、客户现场的物理隔离网段,都有可能让你手里的yum源和apt源形同虚设。这时候装Redis,要么靠内网自建的软件仓库,要么就是纯手工离线安装。我这次要说的就是后者,目标版本是Redis 7.4.0,系统环境是CentOS 7.9和Rocky Linux 8.6都实测过。

如果你正面临以下情况之一,那这篇文章对你就有用了:

  • 服务器在隔离网段,连不上公网yum/apt源
  • 公司安全策略禁止直接走外网下载软件包
  • 现场交付时需要一套可复现的安装流程,不能依赖网络状态
  • 你只是想学会在无网环境下把Redis装明白,不依赖一键脚本

Redis 7.4.0是2024年下半年发布的稳定版本,相比7.0和7.2,它在性能、内存效率和集群稳定性上都有提升,尤其是CLUSTER命令的优化和新的内存碎片整理机制,对于线上高负载场景值得关注。但版本归版本,在离线环境里,安装方式和版本号之间的关系并不大,核心是把依赖、编译环境、安装介质这三件事处理好。

先给结论:离线安装Redis 7.4.0,最靠谱的路线是“源码编译”,不是RPM也不是Docker离线镜像。原因后面我会展开讲。

2. 三种离线方案选型:为什么我最终选了源码编译

很多人一听离线安装,第一反应是:“我提前把RPM包下载好,拷到服务器上rpm -ivh不就行了?”这个思路对很多软件成立,但到了Redis这里,情况不太一样。

2.1 RPM离线安装的坑

Redis官方其实不提供RPM包,各Linux发行版自己维护的Redis版本通常滞后,而且你很难保证手头的RPM和当前系统的glibc、openssl版本完全兼容。更重要的是,RPM离线安装需要手动解决一系列依赖,比如jemalloc、openssl-devel、systemd-devel等,这些包一环扣一环,缺一个就装不上。等你费劲凑齐了依赖,大概率发现装上的Redis版本是6.x甚至5.x,根本不是你想要的7.4.0。

我见过不少人在内网环境用RPM装Redis,装完连redis-cli都没有,还得另外找客户端工具,非常尴尬。

2.2 Docker离线镜像的适用边界

Docker离线镜像(docker save+docker load)在容器化环境里确实方便,但有两个前提:一是服务器上已经装了Docker,二是你通过网络或内网镜像仓库能拿到Redis镜像。如果这两点都满足,那直接走容器方案是没问题的。可现实是,很多离线环境的服务器连Docker都没装,而离线装Docker本身又是一大堆依赖,这就陷入套娃了。

2.3 源码编译为什么最稳

源码编译的优势在于:

  • Redis的编译过程极其简单,本质就三步:./configure --prefix=... && make && make install
  • 对系统依赖要求极低,核心只需要gcc和make
  • 可以选择静态链接方式,把运行时依赖降到最低
  • 版本完全可控,源码包一拷就是完整副本
  • 编译出来的二进制可以直接拷到其他同架构服务器上运行

所以,对于Linux服务器离线安装Redis 7.4.0,源码编译是最省心、最可控的路线。下文将围绕这条路线展开,从介质准备到最终验证,完整走一遍。

3. 动手之前:介质准备与编译环境检查

这一节讲的是“出发前的行囊检查”。如果你在能联网的机器上下载好所有东西再进内网,能省掉一大半麻烦。别嫌这些准备步骤琐碎,我踩过的坑里有八成都是因为少带了一个文件。

3.1 需要准备哪些离线介质

第一样东西:Redis 7.4.0源码包

去Redis官网下载redis-7.4.0.tar.gz,注意下载.tar.gz格式的源码包,文件大小约3MB左右,非常轻量。找一台能联网的机器执行:

wget https://download.redis.io/releases/redis-7.4.0.tar.gz

拿到后先做一件事:用sha256sum计算校验值,记录在另一个文本文件里,方便到内网比对一致性。

sha256sum redis-7.4.0.tar.gz

第二样东西:RPM依赖包

虽然Redis编译的核心依赖少,但你要把编译工具链补齐。以CentOS 7.9为例,需要准备这些RPM包:

依赖包说明是否必需
gccC语言编译器必需
gcc-c++C++编译器(Redis 7.x需要)必需
make构建工具必需
pkgconfig配置脚本需要可选
openssl-devel启用TLS支持时需要按需
systemd-devel生成systemd集成时需要按需

怎么在联网机器上把这些RPM包连同依赖一并下载?用yumdownloader加--resolve参数,它会自动把依赖包也拉下来。比如:

# 先安装yum-utils工具 yum install -y yum-utils # 创建目录并下载gcc及全部依赖 mkdir -p /opt/offline-pkgs cd /opt/offline-pkgs yumdownloader --resolve --destdir=/opt/offline-pkgs gcc gcc-c++ make

如果你的联网机器和离线服务器系统版本不同(比如联网机是CentOS 8,服务器是CentOS 7),这样做会出问题,因为RPM包依赖的glibc版本不一致。最稳的办法是找和服务器同版本的机器来拉RPM。如果没有同版本的,还有一条路:编译机上一旦生成了Redis二进制,其他同架构同系统版本的服务器可以直接拷贝使用,不一定要重复编译。这个技巧后面详细说。

第三样东西:一个临时解压用的目录

服务器上建议规划一个/opt/redis-build目录,专门存放源码包和解压后的文件,装完了可以整体删掉,不污染系统。

3.2 在服务器上检查编译环境

把源码包和RPM包传到服务器上之后,先别急着解压编译。先检查目标服务器上有没有现成的编译工具:

which gcc which make gcc --version

如果gcc存在且版本不低于5.0,Redis 7.4.0的编译基本没问题。如果不存在,就进入离线RPM安装环节:

cd /opt/offline-pkgs rpm -Uvh *.rpm --nodeps

提示:--nodeps参数的意思是忽略依赖检查强制安装,平时我并不推荐滥用。但在离线环境下,只要你能确认依赖包都已经被yumdownloader --resolve拉齐全了,用--nodeps反而能避免个别RPM包依赖顺序的报错。装完之后记得执行gcc --version验证一下。

4. 正式安装:源码包处理全流程

好,环境检查完毕,编译工具就位,现在开始正式安装。整个流程我拆成六个步骤,每一步都有为什么要这么做的解释。

4.1 校验并解压源码包

先校验文件完整性,防止传输过程中出现损坏:

sha256sum redis-7.4.0.tar.gz

比对一下你记录的原始校验值。如果一致,解压:

tar -xzf redis-7.4.0.tar.gz -C /opt/redis-build cd /opt/redis-build/redis-7.4.0

解压之后建议先看一眼目录结构:

ls -l

你会看到src(源码目录)、tests(测试目录)、utils(工具脚本)、redis.conf(默认配置文件模板)等。重点记住redis.conf这个文件,后面配置增量全靠它。

4.2 编译前的配置选项

Redis 7.4.0的编译配置和很多C项目不太一样,它不是必须执行./configure的。你可以直接make,但如果你想指定安装路径,有两个做法。

做法一:通过PREFIX指定安装目录

Redis的Makefile支持PREFIX变量,比如我想把Redis装到/usr/local/redis-7.4.0:

make PREFIX=/usr/local/redis-7.4.0

做法二:编译后再用make install指定目录

make make install PREFIX=/usr/local/redis-7.4.0

我推荐做法二,因为先编译再安装,可以把编译产物保留在源码目录里,万一装失败了改个路径重新install就行,不用重新编译一遍。

4.3 处理内存分配器:MALLOC参数的讲究

这一步是新手最容易踩坑的地方。Redis默认使用jemalloc作为内存分配器,因为它在处理高并发、碎片化内存方面比glibc自带的malloc更好。但jemalloc在编译时需要从源码里构建,如果你所在环境缺少相关工具链,编译可能报错。报错信息类似:

zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory

遇到这种情况,很简单,手动指定使用libc的malloc:

make MALLOC=libc

需要说明一下,MALLOC=libc和生产环境常用的jemalloc在性能上有些差距,主要是内存碎片率可能略高。如果你的服务器内存紧张、业务对内存碎片敏感,建议还是把jemalloc编译上。我实测下来,CentOS 7.9上只要gcc环境完整,直接用默认的jemalloc没问题,不必特意规避。

4.4 执行编译与安装

在源码目录里执行:

make -j4

-j4表示用4个并行任务编译,如果你的服务器CPU核数多,可以调大,比如make -j8。编译过程一般两三分钟就完成了,看到类似Hint: To run 'make test' use 'make test'的信息说明编译成功。

接着安装到指定目录:

make install PREFIX=/usr/local/redis-7.4.0

装完之后去检查一下产物:

ls -l /usr/local/redis-7.4.0/bin/

正常情况下能看到6个文件:

  • redis-server:服务端主程序
  • redis-cli:命令行客户端
  • redis-check-aof:AOF持久化文件检查工具
  • redis-check-rdb:RDB持久化文件检查工具
  • redis-sentinel:哨兵程序,其实是指向redis-server的软链接
  • redis-benchmark:性能测试工具

看到这6个文件,安装这一步就彻底完成了。

4.5 创建配置文件和运行目录

装好二进制之后,配置文件需要单独准备。我把配置文件和运行目录分开规划:

# 创建配置目录 mkdir -p /etc/redis # 创建数据目录 mkdir -p /var/lib/redis # 创建日志目录 mkdir -p /var/log/redis

拷贝一份默认配置作为起点:

cp /opt/redis-build/redis-7.4.0/redis.conf /etc/redis/redis.conf

这个redis.conf就是模板,后续所有参数修改都基于它。注意不要直接改源码目录里的那个,万一改坏了没法恢复。

4.6 配置systemd服务实现开机自启

线上环境很少有人用redis-server /etc/redis/redis.conf这种前台方式跑服务,大多数是用systemd管理。写一个service文件:

vim /etc/systemd/system/redis.service

内容如下:

[Unit] Description=Redis 7.4.0 Server After=network.target [Service] Type=forking ExecStart=/usr/local/redis-7.4.0/bin/redis-server /etc/redis/redis.conf ExecStop=/usr/local/redis-7.4.0/bin/redis-cli -p 6379 shutdown Restart=always User=redis Group=redis PIDFile=/var/run/redis_6379.pid LimitNOFILE=65535 [Install] WantedBy=multi-user.target

几个关键点:

  • Type=forking:因为Redis配置里设置了daemonize yes,主进程会fork出子进程然后退出,所以要用forking类型
  • User=redis:生产环境不能以root运行Redis,这是安全底线
  • LimitNOFILE=65535:提高文件描述符上限,Redis高并发时默认值不够用

创建redis用户:

useradd -M -s /sbin/nologin redis chown -R redis:redis /var/lib/redis chown -R redis:redis /var/log/redis chown -R redis:redis /etc/redis

注意配置文件和数据目录的所有权必须改成redis用户,不然启动时会报权限错误。

5. 配置Redis 7.4.0:生产环境必调的13个参数

二进制装好了、服务托管也做好了,接下来是打开/etc/redis/redis.conf逐项调整。我不打算把所有参数都念一遍,只说那些你如果不调就上线会吃亏的关键项。

5.1 守护进程与网络绑定

daemonize yes

这一项必须改成yes,否则Redis会以前台模式运行,systemd就不好管了。注意Redis 7.x有个变化,daemonize默认是yes,但我建议还是显式写出来,方便后来人看配置的时候一眼了解意图。

bind 0.0.0.0

默认配置里bind是127.0.0.1 -::1,这意味着只能本机访问。如果其他服务器要连这台Redis,必须改成实际监听的IP或0.0.0.0。但0.0.0.0也意味着所有网卡都监听,如果服务器有多网卡且有不信任网络,建议精确指定内网IP。

protected-mode yes

这个需要和bind配合理解。protected-mode yes时,如果Redis没有设置密码且绑定了0.0.0.0,它会拒绝非本机连接。建议保留yes,同时配上密码,双保险。

5.2 端口与密码

port 6379

默认端口6379。如果要换,注意客户端连接参数和防火墙策略同步改。

requirepass your_strong_password

Redis 7.x的认证方式已经默认走ACL了,但requirepass仍然有效。它相当于设置了一个默认用户default的密码。生产环境至少要设一个高强度的,不然扫描器扫到6379端口分分钟被爆破。

5.3 持久化策略

save 900 1 save 300 10 save 60 10000

这三行是RDB快照的触发条件,意思是:900秒内至少有1次写操作就触发快照,300秒内10次写操作触发,60秒内10000次写操作触发。吐槽一句,默认策略在写入量大的情况下会频繁触发RDB,影响性能。如果对数据丢失容忍度较低,建议调大阈值或者干脆改用AOF为主。

appendonly yes appendfilename "appendonly.aof" appendfsync everysec

appendonly yes开启AOF持久化。everysec表示每秒刷盘一次,兼顾性能和数据安全,这是生产环境最常用的平衡点。

5.4 内存管理与淘汰策略

maxmemory 2gb

服务器物理内存有多大、Redis能用到多少,一定要心里有数。如果这里设置得太小,Redis会频繁淘汰key,业务上表现为缓存命中率骤降;设置得太大,可能直接OOM把整台服务器拖垮。建议按物理内存的60%~70%预留。

maxmemory-policy allkeys-lru

这是内存满了之后的淘汰策略。allkeys-lru表示从所有key里按最近最少使用算法淘汰。如果Redis只做缓存,这个策略够用。如果有某些key绝不能淘汰,就要用allkeys-lfu或者给key打上no-eviction标记,也可以用volatile-lru只淘汰设置了过期时间的key。

5.5 日志与系统调优

logfile /var/log/redis/redis.log loglevel notice

日志路径一定要指到Redis用户可写的目录,别用默认的stdout,否则systemd下看日志会很不方便。

maxclients 10000

默认连接数上限是10000,如果不够可以根据场景调整,前提是系统文件描述符上限也要同步调。

5.6 TLS和ACL这些“锦上添花”项

Redis 7.x原生支持TLS,但配置起来涉及证书生成和分发,离线环境尤其费劲。如果业务没有硬性要求,建议先不开TLS,通过内网隔离加密码认证来保证安全。ACL功能我建议至少看一眼,因为它能精确控制不同应用的权限边界,比如给某个业务只开放读写指定前缀的key。这些在redis.conf里的示例都有,真要细说又是一大篇文章。

搞完上面这些,保存退出。用之前写的systemd服务启动试试:

systemctl daemon-reload systemctl start redis systemctl enable redis systemctl status redis

看到active (running)就成功了。然后验证一下功能:

/usr/local/redis-7.4.0/bin/redis-cli -a 'your_strong_password' ping

返回PONG就说明服务正常响应。再来几个常用操作看看:

/usr/local/redis-7.4.0/bin/redis-cli -a 'your_strong_password' set mykey hello /usr/local/redis-7.4.0/bin/redis-cli -a 'your_strong_password' get mykey

如果都能正常返回,那恭喜你,离线安装Redis 7.4.0这关已经过了大半。

6. 已踩过的坑与排查清单

下面这些坑,每一个都是我在反复实操中“亲手踩过”的,整理出来帮你提前避开。

6.1 编译报错:找不到jemalloc或gcc版本过旧

现象

zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory

原因

Redis 7.4.0默认使用内置的jemalloc,但构建jemalloc需要较完整的工具链。另外gcc版本过低也可能在编译中段报奇怪的语法错误。

对策

  • 优先检查gcc版本,低于5.0的建议升级
  • 如果执行环境确实有限,用make MALLOC=libc绕过jemalloc编译
  • 升级gcc如果遇到离线环境,可以去内网镜像站下载配套RPM包

6.2 systemd启动失败:PID文件或权限错误

现象

systemctl start redis

报错提示Failed to write PID file或Can't open the log file。

原因

我遇到这类问题,90%的情况是数据目录、日志目录和配置文件的所有权没有改成redis用户。

对策

chown -R redis:redis /var/lib/redis /var/log/redis /etc/redis

改完所有权再重启一下服务就好。

6.3 客户端无法连接:保护模式挡掉了

现象

同一内网的其他机器用redis-cli -h 服务器IP ping,提示DENIED Redis is running in protected mode。

原因

protected-mode yes+ 未密码/绑定0.0.0.0的组合会拦截非本机连接。这个安全措施其实是在保护粗心的人,但如果你已经设置了requirepass,它就正常放行了。

对策

要么设置密码,要么设置protected-mode no。我建议前者。

6.4 redis-cli忘密码导致大量WARNING

现象

用redis-cli执行ping,返回NOAUTH Authentication required。

原因

没带-a参数或没进交互模式先认证。

对策

redis-cli -a 'your_strong_password' ping

注意-a在命令行里面会暴露密码,如果是多人共用的服务器,可以在redis-cli交互模式里用AUTH your_strong_password来认证,这样不会被ps命令看到。

6.5 过高的网络延迟或代理导致连接超时

现象

客户端连接Redis时超时,但服务端日志里没有错误。

原因

离线环境里如果客户端和服务端之间隔了防火墙,或者有代理做端口转发,连接建立可能被卡住。

对策

  • 检查防火墙策略,确认6379端口对外开放
  • 在客户端执行telnet 服务器IP 6379,看端口通不通
  • 如果网络环境复杂,可以在redis.conf里调timeout和tcp-keepalive

6.6 如何快速验证RDB和AOF文件完好

养成一个习惯:不管是正常备份还是迁移数据,都要校验持久化文件。

/usr/local/redis-7.4.0/bin/redis-check-rdb /var/lib/redis/dump.rdb /usr/local/redis-7.4.0/bin/redis-check-aof /var/lib/redis/appendonly.aof

如果输出类似RDB looks OK,那就放心了。

6.7 常见问题速查表

问题可能原因快速解法
编译时找不到jemalloc.h工具链不完整或gcc过旧make MALLOC=libc
服务启动就退出配置文件路径或格式错误redis-server /etc/redis/redis.conf前台运行看日志
systemd启动权限报错redis用户无对数据目录写权限chown -R redis:redis相关目录
远程连接被拒绝protected-mode开启且无密码设置requirepass
AOF文件损坏无法启动非正常断电或磁盘损坏用redis-check-aof --fix修复
CONFIG SET maxmemory报错内存超限或整数溢出输入64位整数范围内的字节数

7. 多台服务器推广部署的快捷技巧

如果你不是只装一台,而是要在内网批量部署Redis 7.4.0,每次都在每台机器上编译一遍就太浪费时间了。这里有两个我很常用的方法。

方式一:拷贝编译产物

在一台同CPU架构、同操作系统版本的服务器上编译完成后,把/usr/local/redis-7.4.0/bin/整个目录打包,拷贝到目标服务器,执行make install那一步就不需要了,直接把包解压到同样的路径即可。注意静态依赖要一致,主要看glibc版本,同版本系统问题不大。

tar -czf redis-7.4.0-bin.tar.gz -C /usr/local/redis-7.4.0/bin .

目标机器上:

mkdir -p /usr/local/redis-7.4.0 tar -xzf redis-7.4.0-bin.tar.gz -C /usr/local/redis-7.4.0/bin chown -R redis:redis /usr/local/redis-7.4.0

方式二:制作内网yum/apt源

如果你有内网仓库服务器,可以参照RedHat系的createrepo把RPM包做成源,或者用apt的reprepro做Debian系源。这样其他机器就能直接yum install redis了。但这个方案对系统定制化程度高,适合有专人维护内网源的团队。

我个人最常用的还是第一种,拷贝二进制,省心省力,版本可控。

8. 手上留个底:这几条经验是你以后少踩坑的保证

装完Redis 7.4.0只是开始。很多人在安装环节过了,却倒在后续运维和排障上。结合我这些年给客户排查Redis问题的经历,最后再提醒几句。

第一,Redis 7.x对系统的要求比老版本“更现代”,别拿装Redis 3.x的经验来套。它默认开启了ACL机制,配置文件里有些老参数已经改名了,比如activerehashing、hz这些还在,但很多和IO线程、TLS相关的参数如果你不熟,建议直接查官方文档,别靠记忆瞎配。

第二,安装完成后第一时间开启内存监控。离线环境服务器往往不止跑一个业务,Redis只是其中之一。我见过内存被打满之后整台服务器卡死的情况。建议用redis-cli info memory看看used_memory_peak和maxmemory的比例,做到心里有数。

第三,不要在数据还没备份的情况下反复重启测试。我干过一件蠢事:为了调一个参数,连续重启了三次Redis,第三次的时候AOF文件出了点问题,虽然最后用redis-check-aof --fix修好了,但那一瞬间的后背发凉到现在都记得。稳定的做法是:改配置前先BGSAVE,再重启,确保有最新RDB兜底。

第四,离线环境的版本管理要多留个心眼。源码包、编译产物、配置模板最好都归档在一个固定的目录里,比如/opt/redis-stack,并附带一个README说明版本和改动记录。不然三个月后你自己都分不清服务器上装的是哪个版本。

离线安装Redis 7.4.0这件事,要说难,确实不难,本质就是准备好源码、gcc、配置文件这三样东西;要说简单,也有不少细节讲究,尤其是环境差异导致的各种小问题。最关键的还是仔细加耐心,按步骤走,踩过的坑记下来,后续自然会越来越顺。我到现在依然保持着“先校验、再解压、后配置”的习惯,希望你也一样。

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

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

立即咨询