Redis 7.4 源码编译与内核参数调优(openEuler 24.03 信创环境)
一、本篇目标
前两篇完成了升级规划和基础环境准备。本篇开始部署 JeecgBoot 的第一个核心依赖 —— Redis。
Redis 在 JeecgBoot 中承担:
- 用户会话(Token)存储
- 缓存加速
- 分布式锁
- AI 模块的上下文缓存
本篇完成:
- Redis 7.4.11 源码编译
- AOF + RDB 双持久化配置
- 三个系统参数调优(重点)
- systemd 服务
- 启动验证
二、为什么源码编译
Redis 有三种安装方式:
| 方式 | 优点 | 缺点 |
|---|---|---|
| 系统包(dnf install) | 简单 | 版本固定,位置分散 |
| 官方二进制 tar 包 | 免编译 | 需要手动管理 glibc 依赖 |
| 源码编译 | 自包含,完全可控 | 需 3-5 分钟编译 |
选源码编译的理由:
- 二进制、配置、日志都在
/usr/local/redis,一目了然 - 重装系统后从
/data/packages/redis7/解压即恢复 - 编译参数可精确控制
版本选择:Redis 7.4.x 是最新稳定版,本次用 7.4.11。
三、编译环境
3.1 依赖安装
Redis 源码编译需要两个核心库:
dnf install -y jemalloc-devel openssl-devel tcl
说明:
| 包 | 用途 |
|---|---|
| jemalloc-devel | 内存分配器(Redis 默认用 jemalloc 替代 glibc malloc) |
| openssl-devel | SSL/TLS 支持 |
| tcl | 跑 make test 用,可选 |
3.2 下载源码
cd /data/packages
VERSION=7.4.11
wget https://mirrors.huaweicloud.com/redis/redis-${VERSION}.tar.gz
3.3 编译安装
Redis 不需要 ./configure,直接 make:
cd /usr/local/src
tar -xzf /data/packages/redis-7.4.11.tar.gz
cd redis-7.4.11
make -j$(nproc) PREFIX=/usr/local/redis
make install PREFIX=/usr/local/redis
编译时间:1-3 分钟,比 PostgreSQL 快很多。
安装后:
ls /usr/local/redis/bin/
会看到:
redis-benchmark
redis-check-aof -> redis-server
redis-check-rdb -> redis-server
redis-cli
redis-sentinel -> redis-server
redis-server
3.4 属主与配置
# 属主
chown -R redis:redis /usr/local/redis
# 配置目录
mkdir -p /usr/local/redis/conf
cp /usr/local/src/redis-7.4.11/redis.conf /usr/local/redis/conf/redis.conf
chown -R redis:redis /usr/local/redis/conf
# 日志目录
mkdir -p /data/logs/redis
chown -R redis:redis /data/logs/redis
四、Redis 配置
修改 /usr/local/redis/conf/redis.conf 的关键项:
CONF=/usr/local/redis/conf/redis.conf
# 只监听本机(JeecgBoot 同机部署)
sed -i 's|^bind 127.0.0.1 -::1|bind 127.0.0.1|' $CONF
# 关闭保护模式
sed -i 's|^protected-mode yes|protected-mode no|' $CONF
# 日志路径
sed -i 's|^logfile ""|logfile "/data/logs/redis/redis.log"|' $CONF
# 数据目录
sed -i 's|^dir ./|dir /data/redisdata|' $CONF
# 开启 AOF 持久化
sed -i 's|^appendonly no|appendonly yes|' $CONF
# pid 文件
sed -i 's|^pidfile /var/run/redis_6379.pid|pidfile /data/redisdata/redis.pid|' $CONF
关键配置说明:
| 配置 | 值 | 原因 |
|---|---|---|
| bind | 127.0.0.1 | 只本机访问,安全 |
| protected-mode | no | 本机访问免密 |
| logfile | /data/logs/redis/ | 统一日志 |
| dir | /data/redisdata | 数据放数据盘 |
| appendonly | yes | AOF 持久化 |
五、三个系统参数(重点)
Redis 官方明确要求调三个内核参数,否则启动时会打 WARNING,且低内存时可能数据丢失。
5.1 vm.overcommit_memory
问题:Redis 后台保存 RDB 时会 fork 子进程,需要充足的内存分配权限。默认值 0 会让内核在某些情况下拒绝分配。
启动时警告:
WARNING Memory overcommit must be enabled!
解决:
# 临时生效
sysctl vm.overcommit_memory=1
# 永久生效
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
# 确认
sysctl vm.overcommit_memory
期望:vm.overcommit_memory = 1
5.2 net.core.somaxconn
问题:Redis 的 TCP backlog 设置为 511,但系统默认 somaxconn 只有 128,导致高并发时连接被拒。
启动时警告:
WARNING The TCP backlog setting of 511 cannot be enforced
because /proc/sys/net/core/somaxconn is set to the lower value of 128.
解决:
sysctl net.core.somaxconn=1024
echo "net.core.somaxconn = 1024" >> /etc/sysctl.conf
sysctl net.core.somaxconn
期望:net.core.somaxconn = 1024
5.3 关闭 THP
问题:Transparent Huge Pages 会让 Redis 在 fork 和内存操作时产生延迟抖动。Redis 官方强烈建议关闭。
解决:用 systemd oneshot 服务,开机自动关闭:
cat > /etc/systemd/system/disable-thp.service <<'EOF'
[Unit]
Description=Disable Transparent Huge Pages (THP)
Before=redis.service
After=sysinit.target local-fs.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
[Install]
WantedBy=basic.target
EOF
systemctl daemon-reload
systemctl enable --now disable-thp
关键点:RemainAfterExit=yes 让 oneshot 执行完保持 active (exited) 状态。
验证:
cat /sys/kernel/mm/transparent_hugepage/enabled
期望:always madvise [never]
六、systemd 服务
cat > /etc/systemd/system/redis.service <<'EOF'
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
Type=simple
User=redis
Group=redis
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli shutdown
ExecReload=/bin/kill -USR2 $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now redis
systemctl status redis
注意:
Type=simple,因为 redis.conf 里daemonize noLimitNOFILE=65536,Redis 需要大量文件描述符ExecStop用redis-cli shutdown,优雅停止
七、验证
7.1 服务状态
systemctl is-enabled redis disable-thp
systemctl is-active redis disable-thp
期望:全部 enabled + active
7.2 连接测试
/usr/local/redis/bin/redis-cli ping
期望:PONG
7.3 版本和数据目录
/usr/local/redis/bin/redis-cli info server | grep redis_version
ls -la /data/redisdata/
期望:redis_version:7.4.11
7.4 关键:日志无 WARNING
tail -20 /data/logs/redis/redis.log
期望:不再有 WARNING Memory overcommit 和 WARNING TCP backlog
7.5 系统参数最终确认
sysctl vm.overcommit_memory net.core.somaxconn
cat /sys/kernel/mm/transparent_hugepage/enabled
期望:
vm.overcommit_memory = 1
net.core.somaxconn = 1024
always madvise [never]
八、踩坑记录
8.1 日志目录权限
报错:/bin/sh: 行 1: /data/logs/pg.log: Permission denied
原因:/data/logs 属主是 root,redis 用户没权限写。
解决:
mkdir -p /data/logs/redis
chown -R redis:redis /data/logs/redis
8.2 THP 服务显示 inactive
原因:disable-thp.service 用 Type=oneshot,执行完就退出,默认状态是 inactive (dead)。
解决:加 RemainAfterExit=yes,让服务保持 active (exited) 状态,一眼就能看出它生效过。
九、总结
Redis 7.4 部署完成:
- ✅ 源码编译,自包含在
/usr/local/redis - ✅ AOF + RDB 双持久化
- ✅ 三个系统参数全部调优
- ✅ systemd 服务,开机自启
- ✅ 日志无 WARNING
- ✅ 版本 7.4.11
三个系统参数是 Redis 部署的必做项,不做虽然能启动,但生产环境会埋隐患。
下一篇部署 Nginx 1.28。
项目地址:https://gitee.com/dboru/jeecgboot-pg-converter
本系列文章:
- 第 1 篇:为什么从 3.8.3 升级到 3.9.5
- 第 2 篇:环境准备与数据盘规划
- 第 3 篇:Redis 7.4 源码编译与内核参数调优(本文)
- 第 4 篇:Nginx 1.28 源码编译与反向代理配置
- 第 5 篇:PostgreSQL 17 源码编译 + pgvector + SQL 转换
- 第 6 篇:JeecgBoot 后端编译与 systemd 部署
- 第 7 篇:JeecgBoot 前端编译与 Nginx 部署
- 第 8 篇:部署归档与一键恢复方案
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)