☰
Redis 6.2.6 稳定版源码编译安装与生产环境配置全攻略
2026/10/21 4:30:38 网站建设 项目流程

不少朋友找我要一套稳定、能直接上线用的 Redis 安装方案,点名要 6.2.6 这个版本。我接触 Redis 的时间不算短,从 2.x 一路用到 7.x,说句实话,6.2.6 是目前生产环境里最稳的版本之一:它既有 6.2 分支带来的多线程网络模型、客户端缓存等关键能力,又避开了 7.x 早期版本里不少坑。这篇文章我就把整个下载、编译、安装、启动的过程完整走一遍,把每个步骤背后的原因和环境适配细节都讲透,无论是刚入门的新手还是需要快速搭环境的老手,照着做基本不会出问题。

1. 版本选型与环境前置准备

1.1 为什么选择 6.2.6 而不是更高的版本

选版本这件事,很多人的第一反应是“新的总比旧的好”,但在生产环境里这个逻辑经常反着来。Redis 6.2 是官方指定的稳定分支,6.2.6 属于这个分支里比较成熟的补丁版本。我对比过 6.2.6 和后来的 6.2.7、6.2.8,其实差异主要是安全修复和个别 bug 修复,对普通业务场景没有感知差异,所以 6.2.6 完全够用。

相比 7.0 之后的版本,6.2.6 的优势在于兼容性极好。Redis 7.x 引入了新的 RDB 版本号、AOF 文件和命令兼容性的微妙变化,如果你们项目里还跑着老客户端、老运维脚本,升级到 7.x 可能突然冒出一些莫名其妙的问题。而 6.2.6 的协议和数据结构格式和 5.x、6.0 完全兼容,平滑迁移成本极低。同时,6.2.6 支持了 Redis 6.0 引入的多线程 I/O,虽然默认关闭,但打开后在高并发网络场景下性能提升非常明显,这对我来说是刚需。

另外一个实际考量是生态。很多第三方管理平台、中间件、云厂商的托管实例至今仍然停留在 6.2.x,选 6.2.6 等于和主流生态保持一致,遇到问题能快速找到踩过坑的人,相关资料也最多。如果你是给公司搭基础环境,建议直接统一到这个版本来,避免开发环境、测试环境、生产环境版本不一致带来的隐性风险。

1.2 系统环境与依赖清单

安装前必须先搞清自己的系统环境和编译依赖。Redis 是 C 语言写的,编译安装需要 gcc 和 make,另外官方测试套件依赖 tcl,如果想跑make test就得把 tcl 装上。不同发行版命令不一样,我用的是某 Linux 服务器发行版,具体命令如下。

对于基于 Debian/Ubuntu 的系统:

apt-get update apt-get install -y gcc make tcl

对于基于 RedHat/CentOS 的系统:

yum install -y gcc make tcl

如果系统里已经有老版本 gcc,也不要急着覆盖。Redis 6.2.6 对 gcc 版本要求不高,4.8 以上即可正常编译。但如果你用 CentOS 7 自带的 gcc 4.8.5,编译时可能会看到一堆 warning,这很正常,不影响最终产物。要是编译时遇到malloc相关错误,建议直接升级 gcc,或者安装高版本 devtoolset,我后文会专门讲这个坑。

同时确认一下pkg-config和openssl是否存在。Redis 6.2 默认不强制依赖 openssl,但如果你想启用 Redis 的 TLS 功能(比如通过 stunnel 或者官方 TLS 端口),就得提前装好:

yum install -y openssl openssl-devel # 或者 apt-get install -y libssl-dev

没有这些依赖强行编译也不是不行,只是会缺--tls支持,编译完会出现一些头文件找不到的报错。我建议既然都装了,干脆一次装齐,省得后面返工。

1.3 获取安装包的几种方式

获取 Redis 6.2.6 源码包,我推荐三条路,按优先级排序。

第一,官方下载站。直接访问 Redis 官方提供的下载地址,找到redis-6.2.6.tar.gz,这是最干净、最权威的来源。下载后建议用 sha256sum 校验一下完整性。

第二,镜像站。如果服务器在国外下载速度慢,可以使用国内各大云厂商的软件镜像源,它们会定期同步 Redis 官方发布包。这种方式速度快,也不容易断线。

第三,包管理器直接装。有些发行版自带 redis 包,比如 Ubuntu 的apt install redis-server,但这种装出来的版本通常是发行版维护的版本,不一定刚好是 6.2.6,而且安装路径、配置文件结构、启动方式都和官方原版不太一致,如果你要精确控制版本和配置,不建议用这种方式。

我个人的习惯是:先用wget下载到/usr/local/src,校验后解压,然后编译安装到/usr/local/redis。这个路径不是必须的,但是/usr/local下面统一管理第三方软件,查找方便,也符合系统目录规范。

2. 源码编译安装的完整步骤

2.1 下载、解压与校验操作

拿到官方下载地址后,在服务器上执行:

cd /usr/local/src wget https://download.redis.io/releases/redis-6.2.6.tar.gz sha256sum redis-6.2.6.tar.gz

sha256sum会把文件算出一串哈希值,你需要和官方页面上的哈希值做对比。这一步看起来繁琐,但千万别跳。我遇到过从网上找的第三方源码包,编译到一半发现代码被注入了挖矿逻辑。虽然官方下载站不会有这问题,但万一你用了非官方渠道,校验就是最后一道防线。

确认哈希一致后解压:

tar xzf redis-6.2.6.tar.gz cd redis-6.2.6

解压后目录里比较重要的东西包括:src目录存放全部 C 源码和编译产物;redis.conf是默认配置文件模板;utils目录里有install_server.sh脚本和 systemd 相关模板文件。我后续会用到这些。

2.2 编译参数与 make 命令详解

进入目录后,直接执行make就能开始编译。但这里有个细节值得说:Redis 的 Makefile 支持MALLOC=libc参数,用来指定内存分配器。

Redis 默认使用 jemalloc,它在高并发、碎片化场景下表现比 libc 好,还能提供内存碎片率统计能力。如果你的系统没有 jemalloc,编译时会自动回退到 libc。但有一种情况必须手动指定:当系统装了多个 gcc 或者交叉编译环境时,自动检测可能失败,报错jemalloc.h: No such file or directory。遇到这种问题,直接执行:

make MALLOC=libc

如果确定需要 jemalloc,也可以先编译 jemalloc 再整体编译。大多数生产服务器我会直接使用默认的 jemalloc,只有在极端兼容性要求下才退回 libc。

编译过程本身很快,服务器性能正常的话一两分钟就完成。执行:

make -j 4

-j 4表示并行编译,4 是 CPU 核心数。如果你的机器核心多,可以加大这个数字。编译完成后,可以在src目录看到redis-server、redis-cli、redis-sentinel、redis-benchmark等可执行文件。

先别急着装,跑一下官方测试套件是个好习惯:

make test

这个命令会花几分钟时间,跑几百项测试。如果全部通过,会显示All tests passed。如果因为 tcl 版本问题报错,先装好 tcl 再重试。测试能提前暴露出编译环境和运行时环境不匹配的问题,尤其是某些内存分配相关的问题,比上线后再排查省事得多。

2.3 安装路径选择与 install 操作

确认测试通过后,执行安装:

make PREFIX=/usr/local/redis install

这里需要解释PREFIX的用法。如果不指定,Redis 默认把可执行文件装到/usr/local/bin,这样直接全局可用,但会导致文件分布很散,后续升级、卸载都麻烦。我习惯指定独立前缀,比如/usr/local/redis,这样所有 Redis 可执行文件都集中在/usr/local/redis/bin下面。如果你还想让系统直接识别这些命令,可以把/usr/local/redis/bin加到 PATH 环境变量里。

装完之后,还需要把配置文件复制过去:

mkdir -p /usr/local/redis/conf mkdir -p /usr/local/redis/log mkdir -p /usr/local/redis/data cp redis.conf /usr/local/redis/conf/redis.conf

这三个目录分别保存配置、日志和数据。你可能会觉得手动建目录麻烦,但这是好习惯。后续如果要把 Redis 数据目录独立到单独磁盘或者做备份,有几个清晰目录会方便很多。有人喜欢把数据和日志直接放在 Redis 默认路径,一旦系统盘空间满了,Redis 会直接拒绝写入,线上事故的常见原因之一就是这个。

3. 配置初始化与启动管理

3.1 核心配置项解析与修改

配置文件redis.conf是 Redis 运行方式的蓝图。默认配置不适合生产环境,必须手动修改关键项。我一条一条说,先看最重要的几个。

首先是守护进程模式:

daemonize yes

默认是no,意思是 Redis 在前台运行,一旦 SSH 断开进程就没了。改成yes后 Redis 会在后台运行。但从现代化运维角度,我更推荐用 systemd 管理,这种情况下daemonize保持no反而更方便。两者选其一,别同时开启,否则 systemd 会认为进程退出导致管理混乱。

其次是监听地址和端口:

bind 127.0.0.1 ::1 port 6379

bind默认只监听本机回环地址,这很安全。但如果你需要让其他服务器访问这台 Redis,必须改成服务器内网 IP 或者0.0.0.0。注意,0.0.0.0代表监听所有网卡,如果同时暴露在公网且没有密码保护,等于对外裸奔。我见过很多 Redis 被入侵的案例,绝大多数都是因为这个端口直接暴露公网且无认证。所以我的原则是:只在可信内网使用,并且必须设置密码。

然后是数据持久化配置。Redis 默认开启了 RDB 快照,但默认定时策略可能太频繁。看这两行:

save 900 1 save 300 10 save 60 10000

意思是:900 秒内至少有 1 次写操作就触发快照,300 秒内 10 次写操作触发,60 秒内 10000 次写操作触发。这个策略不是死的,你可以根据自己的写入量调整。如果数据重要性极高,再开启 AOF:

appendonly yes appendfilename "appendonly.aof" appendfsync everysec

AOF 记录每次写命令,everysec每秒落盘一次,兼顾安全和性能。如果选always每一条命令都落盘,性能会下降明显;选no由操作系统决定落盘时机,崩溃时可能丢失较多数据。我的建议是everysec,这也是官方推荐策略。

日志配置也要改:

logfile "/usr/local/redis/log/redis.log" loglevel notice

默认情况下 Redis 日志输出到标准输出,如果 daemonize 之后没有配置 logfile,日志会丢失。务必指定一个绝对路径。

最后是 RDB 和 AOF 文件的保存位置:

dir /usr/local/redis/data

这个dir决定所有持久化文件的落盘目录。如果不设置,Redis 会使用启动时的工作目录,容易因为启动位置不同导致数据文件位置漂移,升级脚本很难找到数据。统一指定绝对是长期运维的明智选择。

3.2 通过 systemd 管理 Redis 进程

现在绝大多数服务器都使用 systemd 管理后台服务,Redis 官方源码包也带了一个模板文件,就在utils/systemd目录里。如果你不想手动写,可以参考下面这个我一直在用的 Unit 文件。

在/etc/systemd/system/redis.service中创建:

[Unit] Description=Redis Server After=network.target [Service] Type=forking ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s INT $MAINPID PIDFile=/var/run/redis.pid Restart=always RestartSec=3 User=redis Group=redis [Install] WantedBy=multi-user.target

这里有几个注意点。Type=forking表示 Redis 进程会 fork 出子进程然后父进程退出,这要求配置文件中daemonize yes。如果配置文件里是daemonize no,就应该改成Type=simple,否则 systemd 会认为服务启动失败。

为了安全,我建议创建一个专用系统用户运行 Redis,不要用 root:

useradd --system --no-create-home redis chown -R redis:redis /usr/local/redis

然后把配置里的dir、logfile相关目录属主都改成 redis。之所以要这么做,是因为 Redis 如果被攻击者利用漏洞执行命令,攻击者拿到的权限就是运行用户的权限。用 root 跑 Redis 的后果不堪设想,直接让攻击者拿到整台服务器的 root 控制权。这一步千万不能省。

启动服务:

systemctl daemon-reload systemctl start redis systemctl enable redis

enable是为了设置开机自启。检查状态:

systemctl status redis

看到active (running)就代表成功了。接着用客户端验证一下:

/usr/local/redis/bin/redis-cli -p 6379 ping

如果返回PONG,说明服务通了的。

3.3 密码认证与访问控制

配置密码是投产前必须做的事。找到配置文件中的requirepass这一项:

requirepass YourStrongPassword123

密码别用什么 123456 之类,至少 16 位且包含大小写字母、数字和特殊字符。设置之后,每次用redis-cli连接都需要加-a参数,或者连接后执行AUTH 密码。比如:

/usr/local/redis/bin/redis-cli -p 6379 -a 'YourStrongPassword123'

需要注意,命令行带-a参数会被记录到 shell 历史里。更安全的方式是使用环境变量:

export REDISCLI_AUTH='YourStrongPassword123' redis-cli -p 6379

设置完密码后,如果客户端没有及时更新,会出现NOAUTH Authentication required的错误,这是正常的,提醒你带上密码即可。

除了密码,还可以用rename-command重命名危险命令。Redis 里有几个命令要非常小心,比如FLUSHALL、FLUSHDB、KEYS、CONFIG。在公网环境里,攻击者一旦拿到权限就会用这些命令搞破坏。建议在配置文件中添加:

rename-command FLUSHALL "" rename-command CONFIG ""

把命令重命名为空字符串相当于禁用了该命令。注意,这条配置只适合确定业务不需要的场景。如果业务确实需要用到FLUSHALL,你可以把它改成一个别人猜不到的名字,比如rename-command FLUSHALL "f1ush_4ll_2024"。但我觉得生产环境直接用不到清空数据库这种操作,禁用更安心。

4. 安装过程中的常见问题与排错实战

4.1 编译阶段报错及处理

我在多次安装过程中整理了几个高频编译报错,逐个说。

报错1:jemalloc.h: No such file or directory

这个报错主要是 Makefile 在检测 jemalloc 时失败造成的。最简单的解决办法是用 libc 替代:

make distclean make MALLOC=libc -j 4

注意先执行make distclean清掉之前的编译中间产物,否则重新编译时问题还会残留。

报错2:cc1: all warnings being treated as errors

某些较老的操作系统版本,gcc 版本太低,编译时会把警告当错误处理。Redis 6.2.6 的代码对高版本 gcc 很友好,但对旧版本会有一些不兼容的警告。解决思路是升级 gcc。在 CentOS 7 上可以使用软件集合:

yum install -y centos-release-scl yum install -y devtoolset-7 scl enable devtoolset-7 bash

然后重新编译。或者干脆换一台使用较新系统版本的服务器。我实际测试过,使用 CentOS 7 默认的 gcc 4.8.5 编译 Redis 6.2.6 是能成功的,但如果你的系统比我遇到的还要旧,升级编译器是最省心的路子。

报错3:struct redisServer has no member named ‘XXX’

这种报错通常不是你代码写错,而是源码目录里混入了旧版本的编译产物。执行一次全面清理再重新编译即可:

make distclean make -j 4

如果还不行,看看你是不是从 Git 仓库直接拉代码而不是用官方 release 包。Git 分支代码可能处于开发状态,接口和稳定版有差异。尽量使用下载页面的 tag 包。

4.2 启动阶段报错的定位思路

服务起不来时,第一件事是看日志。我配置的日志路径是/usr/local/redis/log/redis.log,如果文件里没有内容,就用命令直接前台启动看输出:

/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf --daemonize no

这样错误信息会直接打到终端上。

常见的启动失败原因之一是端口被占用。执行:

netstat -tlnp | grep 6379

把占用进程找到并终止,或者修改port配置换一个端口。

另一种情况是权限问题。如果你按照我前面说的用redis用户启动,但没有把数据目录和日志目录的属主改掉,Redis 启动时会提示Can't open the log file: Permission denied或者Can't create pid file。解决方式:

chown -R redis:redis /usr/local/redis chown -R redis:redis /var/run/redis.pid

如果 PID 文件路径属于 root,systemd 的PIDFile路径也需要确保 redis 用户可写。我在实践里通常把 PID 文件放到/var/run/redis.pid,然后创建/var/run/redis.pid为 redis 属主即可。

还有一种隐蔽的问题是vm.overcommit_memory系统参数设置不当。Redis 在启动时如果检测到内存分配策略不安全,会打印警告日志并继续运行。短期内不影响,但一旦内存压力大可能导致 Redis 被系统 OOM Killer 杀掉。按官方建议修改:

echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf sysctl -p

另外关闭 THP 透明大页:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

这个设置要永久化,可以在/etc/rc.local末尾加一行,或者使用 systemd tmpfiles 机制。不关闭 THP,Redis 在低延迟场景下延迟毛刺会非常明显,这是一个很多新手忽略的专坑点。

4.3 上线前的性能参数初调清单

安装成功后,别急着丢到生产环境,先针对你的服务器规格做一轮参数调整。下面是我每次上线都会检查的几个点。

内存策略:

maxmemory 4gb maxmemory-policy allkeys-lru

maxmemory需要根据服务器实际内存设置,预留出系统和 Redis 自身开销的空间。maxmemory-policy是内存用完之后淘汰数据的策略。如果业务缓存场景为主,用allkeys-lru,优先淘汰最久没访问的 key。如果是严格不能丢数据的场景,可以把策略改成noeviction,这样内存满了之后写入直接报错,提醒你扩容,不会默默丢数据。

连接数:

maxclients 10000

默认值 10000,如果你的并发连接比较高,可以往上调。但如果系统文件描述符限制不够,也要同步调整:

ulimit -n 65535

这个临时调整只对当前会话有效。永久生效需要在/etc/security/limits.conf里加上对应配置,或者修改 systemd service 的LimitNOFILE:

[Service] LimitNOFILE=65535

开启多线程 I/O(Redis 6.0 后新增的):

io-threads 4 io-threads-do-reads yes

io-threads设置为 CPU 核心数的一半或者四分之三比较合理,不是越多越好。注意,io-threads只能用于处理网络 I/O 和命令解析的并行化,真正的命令执行依然是单线程的。所以别指望开八个线程让处理能力翻倍,它主要解决的是大并发网络请求下的瓶颈。如果你的机器是 4 核,设置io-threads 2或io-threads 4试试效果,再用redis-benchmark压测对比一下。

最后再提一下慢查询日志,它在你排查生产问题时会非常有帮助:

slowlog-log-slower-than 10000 slowlog-max-len 128

上面配置表示记录执行时间超过 10000 微秒(10 毫秒)的命令,最多保存 128 条。遇到线上延迟突然飙高,用SLOWLOG GET命令直接查看是哪些命令拖慢了 Redis,这是最直接的排查手段。

安装完成之后,我建议把整个安装过程写成自动化脚本,用 Ansible 或 Shell 脚本固化下来。这样以后新服务器上线只需要改改 IP 和密码,几分钟就能复现一套相同配置的 Redis 环境。我最初手工安装了几次之后,就再也不想重复这种纯体力活了。脚本化之后不仅效率高,更重要的是配置一致性有保证,不会出现这台机器调了参数、那台机器忘改的情况。

再分享一个我踩过多次的细节:升级 Redis 版本时,不要直接覆盖安装。先把旧版本的配置文件备份出来,然后对比新旧默认配置的差异,把新增的配置项理解清楚后再上生产。很多问题不是 Redis 本身造成的,而是升级后配置项默认值发生了变化,比如 6.2 版本中sanitize-dump-payload默认值不同,导致某些负载下 CPU 上升。所以每次升级前,diff一下两个版本的配置文件模板,是最保险的操作。

如果你准备把 Redis 从测试环境搬到生产环境,尽量留出半天时间,把数据备份、主从复制、持久化验证都做一遍。安装只是第一步,稳定运行才是最终目的。按照上面这些思路,安装出来一套 6.2.6 之后,再用redis-benchmark简单压一下,看看读写性能和延迟是否符合预期,心里就有底了。

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

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

立即咨询