一、环境准备
- 升级系统依赖并安装编译工具
Redis 编译依赖 gcc、make 等工具,CentOS 7 默认的 gcc 版本较低(4.8.5),Redis 7.0+ 要求 gcc 版本 ≥ 5.3,因此需要升级 gcc:
# 1. 安装基础依赖
yum install -y wget gcc-c++ make cmake tcl-devel
# 2. 升级gcc(可选但推荐,解决编译报错;如安装失败见常见错误解决)
yum install -y centos-release-scl
yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
# 3. 临时启用高版本gcc(当前会话生效)
scl enable devtoolset-9 bash
# 4. 验证gcc版本(需≥9.0)
gcc --version
- 创建 Redis 用户(安全建议)
避免使用 root 运行 Redis,创建专用用户:
useradd -r -s /sbin/nologin redis
二、下载并编译 Redis 7.0.x
- 下载Redis源码
# 切换到/usr/local/src目录(源码统一存放)
cd /usr/local/src
# 下载源码包
redis-7.0.15.tar.gz
# 解压
tar -zxvf redis-7.0.15.tar.gz
# 进入解压目录
cd redis-7.0.15
2.编译并安装
# 编译(指定CPU核心数加速,如make -j4)
make -j $(nproc)
# 安装(指定安装目录为/usr/local/redis)
make PREFIX=/usr/local/redis install
# 验证安装
/usr/local/redis/bin/redis-server --version
# 输出类似:Redis server v=7.0.15 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=abc123456789
三、配置 Redis
- 初始化目录结构
# 创建配置、数据、日志、pid目录
mkdir -p /usr/local/redis/{conf,data,log,run}
# 复制默认配置文件到自定义目录
cp /usr/local/src/redis-7.0.15/redis.conf /usr/local/redis/conf/
# 修改目录权限(归属redis用户)
chown -R redis:redis /usr/local/redis
- 修改核心配置(/usr/local/redis/conf/redis.conf)
编辑配置文件,建议修改以下关键项(注释掉原有配置,新增如下):
vim /usr/local/redis/conf/redis.conf
核心配置修改:
# 1. 绑定IP(允许所有IP访问,生产环境建议指定内网IP)
bind 0.0.0.0
# 2. 保护模式(关闭,否则仅允许本地访问)
protected-mode no
# 3. 端口(默认6379,可自定义)
port 6379
# 4. 以守护进程运行(后台启动)
daemonize yes
# 5. pid文件路径
pidfile /usr/local/redis/run/redis.pid
# 6. 日志文件路径
logfile /usr/local/redis/log/redis.log
# 7. 数据存储目录
dir /usr/local/redis/data
# 8. 设置密码(必填,生产环境强密码)
requirepass YourStrongPassword@123
# 9. 最大内存限制(根据服务器配置,如2GB)
maxmemory 2gb
# 10. 内存淘汰策略(当内存满时)
maxmemory-policy allkeys-lru
# 11. 持久化(开启RDB,可选AOF)
save 900 1
save 300 10
save 60 10000
# 12. 禁用危险命令(生产环境)
rename-command CONFIG ""
rename-command FLUSHDB ""
rename-command FLUSHALL ""
四、配置系统服务(systemd)
创建 systemd 服务文件,方便管理 Redis 启停:
vim /usr/lib/systemd/system/redis.service
写入以下内容:
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
Type=forking
User=redis
Group=redis
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/local/redis/bin/redis-cli -u redis://:YourStrongPassword@123@127.0.0.1:6379 shutdown
Restart=always
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
五、启动并验证 Redis
- 启动 Redis 服务
# 重新加载systemd配置
systemctl daemon-reload
# 启动Redis
systemctl start redis
# 设置开机自启
systemctl enable redis
# 查看状态
systemctl status redis
六、防火墙配置(可选)
如果需要外部访问 Redis,开放 6379 端口:
# 临时开放
firewall-cmd --add-port=6379/tcp --permanent
# 重载防火墙
firewall-cmd --reload
常见问题解决
1、编译报错:error: jemalloc/jemalloc.h: No such file or directory解决:执行 make MALLOC=libc 重新编译(使用系统自带的 malloc 替代 jemalloc)。
2、编译报错:
(1)、 Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64
出现 Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64 错误,是因为 CentOS 7 官方源已停止维护,centos-sclo-rh 等 SCL 源无法访问。
(2)、CentOS 7 官方 SCL 源归档后,devtoolset-8/9 均无法通过 yum 安装
终极兼容方案(无需找配置,直接覆盖编译参数)
步骤 1:强制覆盖编译参数,跳过不兼容检查
直接在 make 命令中传入 CFLAGS 和 WARN 参数,覆盖源码中的默认配置,彻底避开 -Werror=implicit-fallthrough:
# 进入Redis源码目录
cd /usr/local/src/redis-7.0.15
# 清理所有编译残留(关键)
make distclean && make clean
# 核心编译命令:覆盖WARN和CFLAGS,仅保留基础警告,关闭所有高版本严格检查
WARN="-Wall -W" CFLAGS="-O2 -fPIC" make MALLOC=libc -j $(nproc)
# 安装到指定目录
make PREFIX=/usr/local/redis install
步骤 2:验证编译结果
# 检查二进制文件是否生成
ls /usr/local/redis/bin/
# 正常输出:redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server
# 验证版本(无报错即成功)
/usr/local/redis/bin/redis-server --version
3、启动失败:Permission denied解决:检查 /usr/local/redis 目录权限,确保归属 redis:redis。
4、连接超时解决:检查 bind 配置、防火墙、protected-mode 是否关闭。
5、Can't open the log file: Permission denied 可知,Redis 运行用户(redis)没有日志文件目录的写入权限,导致启动失败并反复重启。
修复目录权限
(1). 重新设置 Redis 所有目录的归属权限
确保 /usr/local/redis 下所有子目录(包括 log 日志目录)都归 redis:redis 用户组所有,且有读写权限:
# 递归设置目录归属(redis用户和组)
chown -R redis:redis /usr/local/redis
# 递归设置目录权限(所有者可读写执行,其他只读)
chmod -R 755 /usr/local/redis
# 单独给日志目录额外写入权限(确保能创建/修改日志文件)
chmod 775 /usr/local/redis/log
6、systemctl 启动旧 Redis 版本
(1). 先排查:确认当前 redis.service 指向的版本
首先查看现有 redis.service 中配置的 redis-server 路径,判断是否指向旧版本:
# 查看 redis.service 的 ExecStart 配置(关键行)
sudo grep -E "ExecStart|ExecStop" /usr/lib/systemd/system/redis.service
输出示例(旧版本的问题配置)
ExecStart=/usr/local/bin/redis-server /etc/redis.conf # 这里指向了旧版本的 redis-server
ExecStop=/usr/local/bin/redis-cli shutdown
(2).修改 redis.service 配置,指向 Redis 7.0.15
- 步骤 1:备份原有配置(避免出错无法回滚)
sudo cp /usr/lib/systemd/system/redis.service /usr/lib/systemd/system/redis.service.bak
- 步骤 2:编辑 redis.service 文件(核心是 ExecStart 和 ExecStop)
[Unit]
Description=Redis 7.0.15 Server
After=network.target
[Service]
# 关键:指定 7.0.15 的 redis-server 路径 + 专属配置文件
ExecStart=/home/yourname/redis-7.0.15/src/redis-server /home/yourname/redis-7.0.15/redis.conf
# 关键:指定 7.0.15 的 redis-cli 路径(停止服务用)
ExecStop=/home/yourname/redis-7.0.15/src/redis-cli -p 6379 shutdown # 若改了端口,需同步 -p 端口号
User=redis # 可选:建议用 redis 专用用户(避免 root 权限风险)
Group=redis
Restart=always # 服务异常退出时自动重启
RestartSec=3 # 重启间隔 3 秒
[Install]
WantedBy=multi-user.target
(3). 重新加载配置并启动,验证版本
# 1. 重新加载 systemd 配置(关键步骤)
sudo systemctl daemon-reload
# 2. 停止旧版本 Redis(若已启动)
sudo systemctl stop redis # 若旧版本用其他服务名,需对应修改(如 redis6)
# 3. 启动 Redis 7.0.15(用修改后的 service 文件)
sudo systemctl start redis
# 4. 验证启动状态和版本
sudo systemctl status redis # 先看是否启动成功(active (running))
# 5. 验证运行的是 7.0.15(两种方式)
# 方式 1:查看进程路径和版本
ps aux | grep redis-server | grep -v grep
# 输出示例(确认路径是 7.0.15,版本 7.0.15):
redis 12345 0.0 0.2 10000 4000 ? Ssl 14:00 0:00 /home/yourname/redis-7.0.15/src/redis-server *:6379
# 方式 2:用 7.0.15 的客户端连接验证
/home/yourname/redis-7.0.15/src/redis-cli -p 6379 info server
# 输出中关键行:redis_version:7.0.15
(4). 常见问题排查(若仍启动旧版本)
1). 是否有多个 redis.service 文件?
系统可能存在多个 Redis 服务文件(如 /etc/systemd/system/redis.service 优先级高于 /usr/lib/systemd/system/redis.service),执行以下命令搜索所有服务文件:
sudo find /etc/systemd/ /usr/lib/systemd/ -name "redis*.service" 2>/dev/null
若找到多个,删除旧版本的服务文件(或重命名),只保留修改后的 7.0.15 版本的 redis.service,再重新加载配置:sudo systemctl daemon-reload。
2). 是否忘记停止旧版本?
旧版本可能已占用端口(如 6379),导致 7.0.15 启动失败,此时 systemd 可能未报错但实际未启动。执行以下命令强制停止所有 Redis 进程:
sudo pkill -f redis-server # 停止所有 redis-server 进程
sudo systemctl start redis # 重新启动 7.0.15
3). 配置文件路径是否写错?
若 ExecStart 中的 redis-server 路径或 redis.conf 路径错误,systemd 会启动失败(状态为 failed),查看日志排查:
sudo journalctl -u redis -f # 查看 redis 服务的实时日志,找报错原因(如路径不存在、权限不足)