一、本篇目标

前两篇完成了升级规划和基础环境准备。本篇开始部署 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-develSSL/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

关键配置说明:

配置值原因
bind127.0.0.1只本机访问,安全
protected-modeno本机访问免密
logfile/data/logs/redis/统一日志
dir/data/redisdata数据放数据盘
appendonlyyesAOF 持久化

五、三个系统参数(重点)

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 no
  • LimitNOFILE=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

本系列文章:

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐