说实话,CentOS 8 上装 Redis 这事儿,看着简单,但这两年坑是真不少。系统源里自带的版本偏老、模块流切换搞不明白、装完忘记配密码被扫描器盯上,卸载的时候又因为残留文件导致重装后数据错乱——这些场面我见过太多次了。这篇文章就专门讲清楚两件事:CentOS 8 上怎么把 Redis 装好、配好、跑起来,以及不需要的时候怎么把它卸得干干净净,不留后患。
内容偏实操,适合刚接触 Linux 运维的开发者,也适合那些已经在用但没系统整理过安装卸载流程的同行。我尽量把每一步的“为什么这么做”也讲清楚,而不是单纯丢给你一串命令。
1. 装之前先看清环境与版本选择
1.1 检查系统版本和已有残留
不管你是新机器还是旧机器,动手之前先花两分钟确认环境。我见过太多人上来就敲安装命令,结果要么版本不对,要么机器上早就装过 Redis,端口冲突直接启动失败。
先看系统版本:
cat /etc/redhat-release如果是 CentOS 8.x 就没问题。接着检查是否已经装过 Redis:
redis-server --version rpm -qa | grep redis如果命令不存在,说明没装过;如果命令存在,说明之前装过,继续操作前得先决定是复用还是清除重来。再看一下端口占用情况:
ss -lntp | grep 6379Redis 默认监听 6379,如果这个端口已经被占用,可能是老的 Redis 实例还在跑,也可能是别的程序占用了。端口被占时强行装新版,大概率启动报错,白白浪费时间排查。
1.2 Redis 版本选型:系统源还是源码编译
在 CentOS 8 上装 Redis,主流路线就两条:一条是用系统自带的 dnf 包管理器直接装,另一条是下载源码自己编译安装。两条路我都走过,各有适用场景。
系统源安装的好处是省事,命令少,而且由系统的包管理器统一管理,以后卸载、升级都方便。但缺点也很明显:源里的 Redis 版本通常偏旧。CentOS 8 的 AppStream 源里默认提供 Redis 5,虽然可以通过模块流切换版本,但即便切到高版本,往往也比官方最新版落后不少。
源码编译安装的好处是版本任选,官方发布新版本后你随时能编译部署,还可以根据自己的需求加编译参数。缺点是步骤多、耗时长,而且要自己写 systemd 服务管理文件,对新手不太友好。
我的建议是:如果是测试环境、学习用,优先走系统源安装,快、干净、好卸载。如果是生产环境且对 Redis 版本有明确要求(比如需要 7.x 的新特性),那直接上源码编译,别在旧版本上纠结。
1.3 CentOS 8 镜像源失效问题处理
这里必须单独提一句,因为这是 CentOS 8 特有的坑。CentOS 8 的生命周期结束后,官方源迁移到了归档仓库,如果你装的是早期的 CentOS 8.x 且没有调整过 yum 源,直接执行 dnf 命令往往会报错,提示找不到镜像或者下载元数据失败。
解决办法是切换 vault 源或者国内常见的开源镜像站点提供的 CentOS 8 归档源。操作思路都类似:备份原来的 CentOS-Base.repo,替换成新源地址,然后清缓存重建:
dnf clean all rm -rf /var/cache/dnf dnf makecache如果你不清楚具体配置怎么写,最简单的做法是确认系统当前使用的仓库文件路径(一般是 /etc/yum.repos.d/ 下的 .repo 文件),把它替换成对应镜像站点的归档源配置。这一步不处理好,后面所有 dnf 操作都会卡壳。
2. dnf 安装 Redis 的完整流程
2.1 启用模块流安装指定版本
CentOS 8 的 AppStream 仓库把 Redis 做成了模块流的形式,你可以用 dnf module 命令查看可用的流:
dnf module list redis输出结果里会列出不同的 Redis 版本流,比如 5、6,以及当前默认启用的版本。如果你想装默认版本,直接执行:
dnf install redis -y如果你想指定版本,先启用对应的模块流再安装。比如要装 Redis 6:
dnf module enable redis:6 -y dnf install redis -y模块流切换这个操作其实不复杂,但很多人不知道。默认版本的 Redis 是跟着系统走的,不指定的话装出来往往是老版本。如果你对版本没执念,默认版本完全够用;如果强迫症发作想要新特性,记得先 enable 再 install。
安装完成后验证一下:
redis-server --version能正常输出版本号,说明核心程序已经就位。
2.2 启动服务与 systemd 托管
CentOS 8 上通过 dnf 安装的 Redis 会自动生成 systemd 服务文件,你不用自己写,直接开起来就行:
systemctl start redis systemctl enable redisenable 这一步很关键,它把 Redis 设置为开机自启。很多人装完忘了这步,服务器重启后 Redis 没起来,业务直接断连,排查一圈才发现是没设开机自启。
启动后看状态:
systemctl status redis状态显示 active (running) 就说明已经跑起来了。如果状态异常,先看日志:
journalctl -u redis -n 50 --no-pager日志会告诉你启动失败的具体原因。最常见的几个原因后面专门写一节。
2.3 安全配置:bind、密码、保护模式
服务跑起来只是第一步,不把安全配置做了就等于把 Redis 裸奔在网络上。Redis 默认配置有几个安全弱点:只绑定了 127.0.0.1,但如果你改了 bind;或者保护模式没管好;又或者没有设密码,这些都是被入侵的入口。
修改配置文件 /etc/redis.conf,重点看这几项:
bind 127.0.0.1 protected-mode yes requirepass 你的强密码 daemonize nobind 指定监听地址,默认 127.0.0.1 表示只允许本机访问。如果你需要远程连接,可以改成内网 IP,但绝不要直接设成 0.0.0.0,除非你密码够复杂且防火墙做了严格限制。
protected-mode 是保护模式,开启后如果 Redis 没有密码且没有绑定内网 IP,它会拒绝外部访问,相当于兜底防线,建议保持 yes。
requirepass 就是设置访问密码。这一项强烈建议设置,哪怕是测试环境。因为互联网上有大量扫描器在扫 6379 端口,一旦发现没密码的 Redis,轻则被写入恶意定时任务,重则直接拿你的机器挖矿。
改完配置后重启服务生效:
systemctl restart redis然后用密码登录测试:
redis-cli -a '你的强密码' ping返回 PONG 就说明密码设置成功,服务正常工作。
提示:redis-cli 后面直接跟密码执行命令,会留下命令历史记录。生产环境建议进入交互模式后先用 auth 命令认证,或者临时设置 HISTFILE 指向空设备,减少密码泄露风险。
3. 源码编译安装 Redis 的完整流程
3.1 下载源码包与依赖准备
源码编译最大的优势是版本自由。以官方最新稳定版为例,你只需要去官网找到源码包的下载地址,然后 wget 下来解压就行。这一步的关键在于编译依赖要先装齐,否则 configure 阶段就报错。
安装编译工具链:
dnf install -y gcc make tar wget有些老版本 Redis 还需要 tcl 来跑测试用例,如果你不打算执行 make test,可以不装。编译工具是必须的,我遇到过不少人卡在这一步 — 明明下载了源码,执行 make 却提示 cc 命令找不到,其实就是没装 gcc。
下载源码包并解压:
wget https://download.redis.io/releases/redis-7.x.x.tar.gz tar xzf redis-7.x.x.tar.gz cd redis-7.x.x具体版本号以自己的实际需要为准,7.x 是目前的主流系列,稳定性和新特性都兼顾。
3.2 编译安装要点
进到源码目录后,老版本可能需要先执行 make distclean 清理旧编译产物,新版本直接从 make 开始就行:
make -j4-j4 是启用 4 个并行编译任务,机器核数多的话编译速度会快不少。编译过程出错的话,百分之九十是缺依赖,回到上一步补齐再重来。
编译完成得到的是二进制文件,此时可以手动复制到系统目录,但更省事的做法是直接用 make install:
make install默认会安装到 /usr/local/bin/ 下。安装成功后同样验证版本:
redis-server --version3.3 配置 systemd 服务单元
源码安装和 dnf 安装最大的区别就在这里:系统源安装会自动生成 systemd 配置,源码安装得自己写。不写服务文件也能手动启动,但就没法用 systemctl 管理开机自启,这在生产环境是不能接受的。
先复制官方提供的配置文件到标准位置:
mkdir -p /etc/redis cp redis.conf /etc/redis/redis.conf然后创建 systemd 服务文件 /etc/systemd/system/redis.service,内容思路如下:
[Unit] Description=Redis Server After=network.target [Service] ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop=/usr/local/bin/redis-cli shutdown Restart=always User=root Group=root PIDFile=/var/run/redis.pid [Install] WantedBy=multi-user.target注意 ExecStart 里的路径要和你实际安装位置一致,如果你的 redis-server 不在 /usr/local/bin/,改成对应路径。写完后加载并启动:
systemctl daemon-reload systemctl start redis systemctl enable redis到这里,源码安装的服务也能像 dnf 安装一样用 systemctl 管理了。配置文件的修改方式和前面讲的完全一样,bind、密码、保护模式这些照样得设置,别因为是自己编译的就跳过安全配置。
4. 卸载 Redis:停服、删除、清理残留
4.1 备份数据与停服
卸载之前,最重要的不是执行删除命令,而是确认你的数据有没有备份需求。Redis 的数据都保存在内存里,持久化有两种方式:RDB 快照和 AOF 日志。配置文件里分别对应 dbfilename 和 appendfilename 设置。
查看当前持久化文件:
redis-cli -a '你的强密码' info persistence ls -lh /var/lib/redis/如果你确定这些数据都不需要了,那直接往下走。如果有需要保留的数据,先把目录下的 .rdb 和 .aof 文件复制走,或者用 redis-cli 做一次 BGSAVE 强制生成最新快照后再备份。
备份完成后停服务。不要直接 kill 进程,要走正常关闭流程:
systemctl stop redis或者通过客户端命令优雅关闭:
redis-cli -a '你的强密码' shutdown优雅关闭会触发持久化,把内存中的数据写回磁盘,避免直接 kill 导致数据丢失。systemctl stop 实际也会走这一步,但二者选一个就行,不要重复执行。
4.2 卸载软件包
停服之后才是真正的卸载环节。如果你是 dnf 方式安装的,执行:
dnf remove redis -y它会自动删除 Redis 相关软件包。卸载过程中如果提示有依赖问题,加上 --setopt=clean_requirements_on_remove=1 再试。
如果你是源码编译安装的,情况不太一样:源码包本身没有注册到 dnf 的包管理数据库里,dnf remove 找不到它。正确做法是手动删除二进制文件:
rm -f /usr/local/bin/redis-server rm -f /usr/local/bin/redis-cli rm -f /usr/local/bin/redis-benchmark rm -f /usr/local/bin/redis-check-aof rm -f /usr/local/bin/redis-check-rdb rm -f /usr/local/bin/redis-sentinel同时删掉自己创建的服务文件:
rm -f /etc/systemd/system/redis.service systemctl daemon-reload这一步要特别注意,源码安装删除二进制文件后,systemd 的服务配置还残留着,如果你不删服务文件,systemctl status redis 会一直显示异常状态,虽然实际上服务已经不存在了。
4.3 清理残留文件与痕迹
卸载命令只是把软件包删了,残留文件才是重装时出问题的根源。我在实际工作中遇到过多次这种情况:客户说“我已经卸载了 Redis”,结果重装时端口冲突,查了半天才发现老配置文件还在,服务还在跑。
需要清理的残留位置主要有这几个:
| 位置 | 说明 |
|---|---|
| /etc/redis/ 或 /etc/redis.conf | 主配置文件 |
| /var/lib/redis/ | 持久化数据文件(RDB/AOF) |
| /var/log/redis/ | 运行日志 |
| /var/run/redis.pid | PID 文件 |
| /tmp/ 下相关临时文件 | 临时转储文件 |
逐项清理:
rm -rf /etc/redis /etc/redis.conf rm -rf /var/lib/redis rm -rf /var/log/redis rm -f /var/run/redis.pid如果卸载前没有停服,Redis 进程还会占着端口。检查一下:
ss -lntp | grep 6379如果有残留进程,用 systemctl stop redis 或 redis-cli shutdown 停掉,杀干净进程再删除文件。
最后确认一下 Redis 相关用户和用户组是否要保留。一般情况下不用特意清理,但强迫症可以查一下:
id redis如果确认不需要这个用户,可以一并删除,但不是必须。
注意:清理持久化文件前一定要确认数据不再需要。RDB 和 AOF 文件删了无法恢复,这点务必要有备份意识。
5. 常见问题与排查实录
5.1 dnf 安装时找不到 redis 包
这个问题出现频率极高,尤其是 CentOS 8 环境。执行 dnf install redis 提示没有匹配的包,多半是模块流或者仓库源的问题。
排查思路三步走:
dnf module list redis dnf repolist dnf makecache如果 module list 输出为空,说明 AppStream 仓库没启用或者源有问题,回到第一节讲的镜像源处理。如果仓库正常但 still 提示找不到,试试直接指定模块:
dnf module install redis:6有时候默认模块流没有启用,直接指定版本流反而能装上。
5.2 启动失败:PID 文件或权限问题
启动 Redis 时报错日志里出现 Permission denied 或者 Address already in use,通常有两种情况。
第一种是 /var/lib/redis 目录权限不对。Redis 进程需要对该目录有读写权限,否则持久化失败。解决办法:
chown -R redis:redis /var/lib/redis chmod 700 /var/lib/redis第二种是端口被占用。用 ss -lntp | grep 6379 查看占用进程,如果确认是残留的 Redis 进程,先停掉再启动新的。
还有一种比较少见的:Redis 6 及以上版本启动时会检查 maxmemory、protected-mode 等配置项,如果你的配置文件里写了过时的参数,启动会直接报错并拒绝运行。处理办法是把配置文件里旧的参数项注释或删除,保留 Redis 当前版本支持的配置。
5.3 卸载后重装出现数据冲突
这个问题几乎都是残留文件引起的。有人卸载前没有清理 /var/lib/redis 目录,重装后发现“新装”的 Redis 里居然有旧数据,吓了一跳,以为是版本升级自动迁移了,实际上就是 RDB 文件没删干净。
更隐蔽的是配置文件残留。dnf remove 通常不会删除 /etc/redis.conf,重装后你改的不是新配置而是旧配置,一些诡异的行为让人摸不着头脑。我的一般做法是:卸载后把这些目录整体删掉,再装的时候就当它是一台干净机器,所有配置从零开始。
5.4 redis-cli 连接超时
装好 Redis 后,用 redis-cli ping 一直卡住或提示超时。优先检查 bind 配置和 protected-mode,如果 bind 只写了 127.0.0.1,而你在另一台机器上执行 redis-cli 连接,那必然超时。本地连接也超时的,检查防火墙是否拦截了回环地址的流量,虽然极少见,但我确实遇到过本机防火墙策略把 6379 入站过滤的情况。
还有一种情况是 Redis 服务根本没起来,systemctl status redis 显示 failed。这种情况看日志定位问题最直接:
journalctl -u redis -n 100 --no-pager日志里如果有 key 的报错信息,基本就是配置文件哪一项写错了,对照报错行去改配置文件就行。
6. 一些个人实操体会
最后分享几个实际经验,都是我踩过坑之后总结的习惯。
第一,无论生产还是测试,装 Redis 第一件事就是设密码。Redis 的默认配置在保护模式下还好,但一旦你为了远程访问改了 bind,密码就是唯一防线。我见过不止一次没设密码的 Redis 被扫描器命中,机器被拿去挖矿,最后只能重装系统。
第二,卸载操作前养成先备份后审查的习惯。哪怕心里已经决定“数据都不要了”,也花几秒钟看一眼 /var/lib/redis 下的文件大小。有时候看似没用的数据,实际上是你同事在用的测试缓存,删了再解释成本就高了。
第三,源码编译安装容易让人忽视服务文件的维护。dnf 装的 Redis 卸载后服务文件清理是自动完成的,源码装的就得手动删干净。所以但凡能用 dnf 解决的环境,我建议优先用 dnf,省心很多。真的有版本强需求再走源码编译,但一定要把服务文件所在的目录记清楚,卸载时别漏掉。
第四,遇到问题先看日志,不要反复重装。很多人一遇到 Redis 启动失败就卸载重装,其实核心问题根本没解决,装完还是报错。systemd 的 journalctl 日志已经把原因写得清清楚楚,花三分钟看日志,往往比重装半小时高效得多。
这些经验算不上什么高深技巧,但确实是在一次次折腾里沉淀出来的。按这个流程操作,CentOS 8 上装 Redis、卸 Redis 都能少走不少弯路。