Ubuntu下编译安装Redis:从0到1可用的完整指南

为什么要从源码编译?

apt install redis-server不香吗?香,但有几个问题:

  • 版本滞后:Ubuntu 22.04官方源里的redis-server还在7.0.x,而Redis开源版已经到8.x了。
  • 编译选项不可控:官方包不会给你开TLS支持、不会帮你集成systemd通知、也不会让你选jemalloc还是libc。
  • 路径不灵活 :我想把不同版本的Redis分别装到/usr/local/redis/8.0.6/usr/local/redis/8.2.x,方便灰度升级和回滚,官方包做不到。

生产环境我推荐源码编译------不是为了折腾,是为了可控

前置条件

  • 一台Ubuntu 20.04或22.04的服务器(虚拟机或物理机都行)
  • root权限或sudo权限
  • 至少2GB可用内存(生产环境建议4GB+)
  • 网络能通GitHub或Redis官网(下载源码)

我在Ubuntu 22.04上实测的,下面的命令都跑过。


第一步:系统准备与依赖安装

先把系统包更新一下,然后装上编译依赖。

复制代码
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential tcl libssl-dev libjemalloc-dev libsystemd-dev pkg-config

这几个包分别干啥的:

|-------------------|-------------------------------|
| 包名 | 用途 |
| build-essential | gcc、g++、make等编译工具链 |
| tcl | Redis测试套件依赖 |
| libssl-dev | TLS/SSL支持(BUILD_TLS=yes时需要) |
| libjemalloc-dev | jemalloc内存分配器头文件 |
| libsystemd-dev | systemd集成支持 |
| pkg-config | 依赖检测工具 |

⚠️ 踩坑提醒libjemalloc-dev这个包很多人会漏掉。如果没装,编译时会报jemalloc/jemalloc.h: No such file or directory。虽然可以用make MALLOC=libc绕过,但生产环境我强烈建议用jemalloc------它在高并发下的内存碎片控制比libc好得多。

检查GCC版本(Redis 8.0要求GCC 4.9+,推荐10+):

复制代码
gcc --version

如果版本低于4.9,需要升级。Ubuntu 20.04/22.04默认的gcc是9.x/11.x,够用。


第二步:下载与编译Redis

Redis 8.0.6 于 2026年2月23日 发布,是 8.0 LTS 分支的最新补丁版本。

关于下载目录的说明 :本文档以 /usr/src 作为源码下载和解压目录(Linux存放源码的标准位置)。如果你希望使用其他目录(如 /data/tools),请将下文所有 /usr/src 替换为你的实际路径,并保持一致。

复制代码
cd /usr/src
sudo wget -O redis-8.0.6.tar.gz https://github.com/redis/redis/archive/refs/tags/8.0.6.tar.gz
sudo tar xzf redis-8.0.6.tar.gz
cd redis-8.0.6

版本选择建议:本文使用 8.0.6 作为示例。生产环境建议选择你所在大版本的最新补丁版本(如 8.0.x 系列的最新版),以获取最新的安全修复。

接下来是编译:

复制代码
# 如果不想看满屏编译日志,可以去掉 V=1 或改为 V=0
make V=1 OPTIMIZATION=-O3 USE_JEMALLOC=yes USE_SYSTEMD=yes BUILD_TLS=yes CFLAGS="-flto" -j "$(nproc)"

参数解释:

|--------------------|-------------------------------|
| 参数 | 作用 |
| USE_JEMALLOC=yes | 使用jemalloc内存分配器(显式指定更安心) |
| USE_SYSTEMD=yes | 启用systemd支持,服务状态可以正确通知systemd |
| BUILD_TLS=yes | 开启TLS/SSL加密连接支持 |
| OPTIMIZATION=-O3 | 最高级别编译优化 |
| CFLAGS="-flto" | 链接时优化,提升运行时性能 |
| -j "$(nproc)" | 用所有CPU核心并行编译,快很多 |
| V=1 | 输出详细编译日志(可去掉,但排查编译问题时很有用) |

编译完成后跑一下测试(可选,但建议跑):

复制代码
make test

特别提醒 :在低配机器(2GB内存及以下)上,make test 可能会因为资源不足导致部分测试失败。这是环境问题,不影响Redis本身的编译质量 。测试失败后,Redis二进制文件(src/redis-server)已经编译完成,可以直接继续安装。如果测试通过了,那是锦上添花。

测试执行完成后,安装到 /usr/local/redis/8.0.6

复制代码
# 创建安装目录
sudo mkdir -p /usr/local/redis/8.0.6

# 安装到指定目录
sudo make install PREFIX=/usr/local/redis/8.0.6

注意PREFIX 必须大写。make install 会将二进制文件安装到 PREFIX/bin 目录下。

安装后的目录结构:

复制代码
/usr/local/redis/8.0.6/
└── bin/
    ├── redis-benchmark
    ├── redis-check-aof
    ├── redis-check-rdb
    ├── redis-cli
    ├── redis-sentinel
    └── redis-server

为什么选 /usr/local/redis/8.0.6 /usr/local 是存放用户自行安装的第三方软件的标准目录。带版本号的目录结构方便未来升级------你可以把 8.0.6 和 8.2.x 装在不同目录,通过软链接或调整 systemd 的 ExecStart 路径来平滑切换,回滚也只需要改一行配置。

为了方便日常使用,把 /usr/local/redis/8.0.6/bin 加入PATH(可选):

复制代码
echo 'export PATH=/usr/local/redis/8.0.6/bin:$PATH' | sudo tee /etc/profile.d/redis.sh
source /etc/profile.d/redis.sh

验证安装:

复制代码
/usr/local/redis/8.0.6/bin/redis-server --version

预期输出类似:

复制代码
Redis server v=8.0.6 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=xxx

看到malloc=jemalloc就对了。


第三步:创建system用户与目录结构

Redis需要一个专用的系统用户来运行,降低安全风险。同时创建数据、日志目录。

复制代码
# 创建system用户(-r表示系统用户,-s /bin/false禁止登录)
sudo useradd -r -s /bin/false -d /var/lib/redis redis

# 创建必要目录
sudo mkdir -p /var/lib/redis   # 数据持久化目录(RDB/AOF)
sudo mkdir -p /var/log/redis   # 日志目录
sudo mkdir -p /etc/redis       # 配置文件目录

# 目录归属:redis用户拥有数据目录,日志目录也归redis
sudo chown -R redis:redis /var/lib/redis /var/log/redis

关于 /run/redis:这个目录放pid文件,由systemd通过 RuntimeDirectory 自动管理,不需要手动创建。


第四步:生产环境配置(完整配置文件,直接复制使用)

推荐做法 :直接将下方完整的 redis.conf 内容复制,替换掉 /etc/redis/redis.conf 文件。你只需要修改 3 个地方requirepass(密码)、maxmemory(内存大小)、bind(IP地址)。

复制代码
# 备份原配置(可选)
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.bak

# 直接用下面的完整配置覆盖
sudo vim /etc/redis/redis.conf

完整配置文件(可直接复制使用)

⚠️ 重要提示 :Redis 配置文件 不支持行内注释 (即 save 900 1 # 这是注释 这种写法会被解析成参数,导致 Invalid save parameters 错误)。以下配置已将所有注释移到单独行,可直接复制使用。

将以下内容完整复制到 /etc/redis/redis.conf

复制代码
# ============================================================================
# Redis 生产环境配置文件(基于 Redis 8.0.6)
# 说明:只改 requirepass、maxmemory、bind 这3处即可使用
# ============================================================================

# ----------------------------- 网络配置 -------------------------------------

# 绑定的IP地址(必须修改)
# 场景一:只有本机访问(最常见)------用下面这行
bind 127.0.0.1
# 场景二:需要远程访问------取消下面这行的注释,并把 IP 换成你的内网地址
# bind 127.0.0.1 192.168.1.100

# 监听端口(建议改掉默认端口,防扫描)
port 6379

# 保护模式:未设密码时拒绝外部访问。设了密码后此选项不影响功能,保留即可
protected-mode yes

# 最大客户端连接数(根据系统文件句柄调整)
maxclients 10000

# TCP backlog(需配合 sysctl 内核参数 net.core.somaxconn 一起调整)
# 本配置在 redis.conf 中,net.core.somaxconn 在 /etc/sysctl.conf 中
tcp-backlog 511

# 空闲连接超时(秒),0表示永不超时
timeout 300

# TCP keepalive(秒)
tcp-keepalive 300


# ----------------------------- 安全认证 -------------------------------------

# 设置强密码(必须修改,至少12位,含大小写+数字+特殊字符)
requirepass Xh9Lp2Qz3$mK#8fG

# 禁用危险命令(防止误删数据)
rename-command FLUSHALL ""
rename-command FLUSHDB ""


# ----------------------------- 内存管理 -------------------------------------

# 最大内存限制(必须修改),建议设为物理内存的70%-80%
# 示例:8GB内存 -> maxmemory 6gb,16GB内存 -> maxmemory 12gb
maxmemory 6gb

# 内存淘汰策略(缓存场景推荐 allkeys-lru)
maxmemory-policy allkeys-lru

# 内存淘汰检查频率(越快越精准,越耗CPU)
maxmemory-samples 5


# ----------------------------- 持久化配置 -------------------------------------

# RDB 快照触发条件
# 900秒内至少1次变更 -> 触发RDB快照
save 900 1
# 300秒内至少10次变更 -> 触发RDB快照
save 300 10
# 60秒内至少10000次变更 -> 触发RDB快照
save 60 10000

# RDB文件名
dbfilename dump.rdb

# RDB文件存储目录
dir /var/lib/redis

# 压缩RDB文件(节约磁盘,消耗CPU)
rdbcompression yes

# 校验和(增加约10%开销,推荐开启)
rdbchecksum yes


# AOF 持久化配置

# 是否开启AOF(数据可靠性要求高时开启)
appendonly yes

# AOF文件名
appendfilename "appendonly.aof"

# 刷盘策略:always(最安全)/ everysec(平衡)/ no(最快)
appendfsync everysec

# 混合持久化(RDB + AOF,推荐开启)
aof-use-rdb-preamble yes

# AOF重写触发条件
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# AOF加载时忽略末尾损坏数据(防止重启失败)
aof-load-truncated yes


# ----------------------------- 日志配置 -------------------------------------

# 日志级别:debug / verbose / notice / warning
loglevel notice

# 日志文件路径
logfile /var/log/redis/redis.log


# ----------------------------- 进程管理 -------------------------------------

# PID文件路径,必须与systemd的RuntimeDirectory和PIDFile一致
pidfile /run/redis/redis.pid

# 数据库数量
databases 16

# 是否以守护进程运行(systemd模式下必须设为 no,由systemd管理)
daemonize no

# 是否启用systemd监督模式(必须为 yes)
supervised systemd


# ----------------------------- 性能调优 -------------------------------------

# 是否禁用透明大页(THP),生产环境建议开启
# 注意:此选项仅控制 Redis 进程内部的内存行为,建议同时配合第六步的内核全局禁用
disable-thp yes

# 客户端输出缓冲区限制(防止慢客户端占用内存)
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60


# ----------------------------- 主从复制 -------------------------------------

# 以下为从库配置示例(如需开启,取消注释)
# replicaof <masterip> <masterport>
# masterauth <master-password>

# 从库是否只读
replica-read-only yes

# 复制积压缓冲区大小(用于断线续传)
repl-backlog-size 1mb

# 主从断开后,从库是否继续提供服务
replica-serve-stale-data yes


# ----------------------------- 慢查询日志 -------------------------------------

# 慢查询阈值(微秒),超过此值的命令会被记录
slowlog-log-slower-than 10000

# 慢查询日志最大长度
slowlog-max-len 128


# ----------------------------- 安全加固 -------------------------------------

# 禁用 DEBUG 命令(生产环境建议禁用)
rename-command DEBUG ""

配置修改清单(必改3项)

|---------------|---------|----------------------------|
| 配置项 | 行号参考 | 修改建议 |
| requirepass | 第39行 | 改成你自己的强密码 |
| maxmemory | 第51行 | 改成你物理内存的70%-80% |
| bind | 第13-15行 | 确认IP是否正确(默认127.0.0.1仅本地访问) |

其他参数都可以直接用,不需要再手动查找了。


启动前哨:配置语法验证(必做!)

这一步必须在启动systemd服务之前执行,相当于给配置上一道"安全门"。

Redis官方没有提供类似nginx -t的配置校验工具。网上有些文章教你用redis-server /path/redis.conf --test-memory 1这完全是个陷阱 --------test-memory是用来做内存带宽压测的,它根本不会解析你的配置语法!

我的土办法,靠谱且直接

复制代码
# 前台启动Redis,让它在当前终端输出所有启动日志
sudo -u redis /usr/local/redis/8.0.6/bin/redis-server /etc/redis/redis.conf --daemonize no --loglevel debug

如何判断配置是否通过?

  • 有报错输出 :配置文件有语法错误或路径权限问题。报错信息会直接显示在终端上,包含具体的行号和错误原因(如 Invalid save parameters)。

  • 没有任何输出 (或只显示少量启动信息):这是好消息,说明配置文件语法正确,Redis 已成功启动。

  • 没有任何输出但不确定 :打开另一个终端,用 redis-cli ping 测试连通性:

    /usr/local/redis/8.0.6/bin/redis-cli -a 'Xh9Lp2Qz3$mK#8fG' ping

    返回 PONG 说明 Redis 正常运行

💡 为什么没有输出?loglevel debug 时,如果一切正常,Redis 不会主动输出"Ready to accept connections"这样的欢迎语。没有输出 + ping 能通 = 配置正确。

验证通过后,在运行 redis-server 的终端按 Ctrl+C 停止进程,然后继续执行下一步。


第五步:systemd服务托管

生产环境必须用systemd管理,别再用redis-server /etc/redis/redis.conf &这种野路子。

5.1 创建systemd服务文件

创建/etc/systemd/system/redis.service

复制代码
sudo tee /etc/systemd/system/redis.service << 'EOF'
[Unit]
Description=Redis In-Memory Data Store (8.0.6)
After=network.target
Documentation=https://redis.io/documentation

[Service]
User=redis
Group=redis
Type=notify
NotifyAccess=all
PIDFile=/run/redis/redis.pid
ExecStart=/usr/local/redis/8.0.6/bin/redis-server /etc/redis/redis.conf --supervised systemd
# 关键修正:不再使用ExecStop传入明文密码
# 我们依赖Redis自身的--supervised systemd机制处理SIGTERM信号,进行优雅退出
KillMode=control-group
TimeoutStopSec=10
Restart=always
RestartSec=5
LimitNOFILE=65535
LimitMEMLOCK=infinity
# RuntimeDirectory让systemd自动创建/run/redis目录,权限0755
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
ReadWriteDirectories=/var/lib/redis
ReadWriteDirectories=/var/log/redis
ProtectSystem=full
PrivateTmp=yes

[Install]
WantedBy=multi-user.target
EOF

设计思路

  • PIDFile=/run/redis/redis.pid让systemd能准确追踪Redis主进程
  • RuntimeDirectory=redis让systemd在服务启动前自动创建/run/redis目录(tmpfs重启即清空,非常适合放pid文件)
  • 为什么删掉ExecStop?因为Redis在启用--supervised systemd后能捕捉SIGTERM优雅退出,不需要在命令行里明文写密码

5.2 启用并启动服务

复制代码
sudo systemctl daemon-reload
sudo systemctl enable redis
sudo systemctl start redis
sudo systemctl status redis

预期输出(关键行):

复制代码
● redis.service - Redis In-Memory Data Store (8.0.6)
     Loaded: loaded (/etc/systemd/system/redis.service; enabled; preset: enabled)
     Active: active (running) since Mon 2026-07-13 10:23:45 CST; 5s ago
   Main PID: 12345 (redis-server)
      Tasks: 5 (limit: 65535)
     Memory: 4.2M
        CPU: 124ms
     CGroup: /system.slice/redis.service
             └─12345 /usr/local/redis/8.0.6/bin/redis-server 127.0.0.1:6379

看到active (running)就稳了。

💡 提示Type=notify 模式下,Redis 启动成功后会主动通知 systemd。如果 systemctl start redis 卡住超过 30 秒,大概率是配置有问题,建议用 journalctl -u redis -f 查看实时日志。


第六步:内核参数调优

这一步很多人会忽略,但生产环境必须做,否则Redis在fork做RDB/AOF重写时可能莫名其妙挂掉。

注意 :虽然第四步的配置文件中已开启 disable-thp yes(进程级别控制),但本步骤通过内核参数 全局禁用 透明大页(THP),两者配合效果更佳。建议先完成本步骤的内核全局禁用,再启动 Redis 服务。

编辑/etc/sysctl.conf,追加:

复制代码
# 允许内核overcommit内存,避免fork时分配失败
vm.overcommit_memory = 1

# 减少swap倾向,Redis最怕被swap出去
vm.swappiness = 1

# 提升TCP全连接队列
net.core.somaxconn = 65535

生效:

复制代码
sudo sysctl -p

禁用透明大页(THP) ------这个坑我踩过。THP会导致Redis在fork时延迟剧烈抖动。

临时禁用:

复制代码
echo never > /sys/kernel/mm/transparent_hugepage/enabled

永久禁用(创建systemd服务):

复制代码
sudo tee /etc/systemd/system/disable-thp.service << 'EOF'
[Unit]
Description=Disable Transparent Huge Pages
After=sysinit.target
Before=redis.service

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled"
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

启用:

复制代码
sudo systemctl enable disable-thp.service
sudo systemctl start disable-thp.service

验证:

复制代码
cat /sys/kernel/mm/transparent_hugepage/enabled

预期输出:always madvise [never]


补充步骤:日志轮转与文件句柄(生产环境必备)

1. 配置Logrotate(防止磁盘写爆)

创建/etc/logrotate.d/redis

复制代码
sudo tee /etc/logrotate.d/redis << 'EOF'
/var/log/redis/redis.log {
    daily
    rotate 7
    maxsize 100M
    missingok
    compress
    delaycompress
    notifempty
    copytruncate
    sharedscripts
    su redis redis
}
EOF

为什么用 copytruncate 我知道理论上存在写入偏移量错乱的风险,但这个方案在Redis社区被大量生产环境采用,实际故障率极低。我在多个生产环境(Redis 6.x~8.x)用这套配置跑了好几年,从未因此出过问题。相比用postrotate + kill -HUP需要额外处理密码问题,copytruncate简单可靠得多。

2. 统一文件句柄限制

注意区分两处配置的作用范围

  • systemd服务的文件句柄由 LimitNOFILE=65535 控制(已在 redis.service 中配置),对Redis服务进程生效
  • /etc/security/limits.conf 仅影响用户 shell 环境下执行的命令(如 sudo -u redis /usr/local/redis/8.0.6/bin/redis-cli

/etc/security/limits.conf末尾追加:

复制代码
redis soft nofile 65535
redis hard nofile 65535

如果你用 root 执行 /usr/local/redis/8.0.6/bin/redis-benchmark 压测,需要额外配置:

复制代码
# 临时生效
ulimit -n 65535

# 或永久配置 /etc/security/limits.conf 中增加
root soft nofile 65535
root hard nofile 65535

保存后,新开一个终端会话生效。


验证方法

1. 配置语法验证

已经在"启动前哨"章节完成,此处不再重复。

2. 服务状态与连接测试

复制代码
sudo systemctl status redis
/usr/local/redis/8.0.6/bin/redis-cli -a 'Xh9Lp2Qz3$mK#8fG' ping

预期输出:PONG

3. 内存配置验证

复制代码
/usr/local/redis/8.0.6/bin/redis-cli -a 'Xh9Lp2Qz3$mK#8fG' CONFIG GET maxmemory
/usr/local/redis/8.0.6/bin/redis-cli -a 'Xh9Lp2Qz3$mK#8fG' CONFIG GET maxmemory-policy

4. 性能基准测试(可选)

复制代码
/usr/local/redis/8.0.6/bin/redis-benchmark -h 127.0.0.1 -p 6379 -a 'Xh9Lp2Qz3$mK#8fG' -t set,get -n 100000 -c 50 -d 1024

这个命令会模拟50个并发客户端,总共执行10万次SET和GET请求,数据大小为1024字节。记录下QPS和延迟数据,作为后续调优的基线。


常见问题

Q1:make test 在低配机器上报错

在2GB内存的虚拟机或容器上执行 make test 时,可能会遇到以下错误:

复制代码
*** [err]: Test child sending info in tests/integration/rdb.tcl
COW info wasn't reported
*** [err]: Test master memory does not increase during replication in tests/integration/replication-rdbchannel.tcl
Replica not in sync after 10 seconds
*** [err]: Test master continues RDB delivery if not all replicas are dropped in tests/integration/replication-rdbchannel.tcl
Sync session did not continue
                          master_link_status: down
                          sync_full:2
                          connected_slaves: 1
Cleanup: may take some time... OK
make[1]: *** [Makefile:485: test] Error 1

原因 :这些是集成测试(rdb.tcl、replication-rdbchannel.tcl),需要在低负载环境下运行。在2GB内存的机器上,fork子进程做RDB快照时系统资源紧张,导致测试超时或失败。这是环境问题,不是Redis源码有bug。

解决 :测试失败不影响编译出的Redis二进制文件质量,直接跳过测试,执行 sudo make install PREFIX=/usr/local/redis/8.0.6 即可。然后用 redis-server --version 验证二进制是否正常。


Q2:配置验证时报错 Invalid save parameters

复制代码
*** FATAL CONFIG FILE ERROR (Redis 8.0.6) ***
Reading the configuration file, at line 66
>>> 'save 900 1     # 900秒内至少1次变更'
Invalid save parameters

原因 :Redis 配置文件 不支持行内注释 。你把注释写在了 save 命令的同一行,Redis 把 # 后面的内容也当成参数解析了。

正确写法 :注释必须单独成行,配置行本身不能带 #

复制代码
# 900秒内至少1次变更 -> 触发RDB快照
save 900 1

解决 :直接用本文档第四步提供的完整配置覆盖 /etc/redis/redis.conf,该配置已将所有注释移到单独行。


Q3:配置验证时没有任何输出,不知道是否成功

复制代码
root@ubuntu:/data/tools/redis-8.0.6# sudo -u redis /usr/local/redis/8.0.6/bin/redis-server /etc/redis/redis.conf --daemonize no --loglevel debug
(没有任何输出)

原因 :当 loglevel debug 且一切正常时,Redis 不会主动输出"Ready to accept connections"这样的欢迎语。没有输出 = 配置正确,Redis 已成功启动

验证方法 :打开另一个终端,用 redis-cli ping 测试:

复制代码
/usr/local/redis/8.0.6/bin/redis-cli -a '你的密码' ping
# 返回 PONG 说明 Redis 正常运行

看到 PONG 后,在运行 redis-server 的终端按 Ctrl+C 停止进程,继续执行后续步骤。


Q4:cp redis.conf /etc/redis/redis.conf 报错 No such file or directory

复制代码
sudo cp /usr/src/redis-8.0.6/redis.conf /etc/redis/redis.conf
cp: cannot stat '/usr/src/redis-8.0.6/redis.conf': No such file or directory

原因 :你当前所在目录或源码解压路径与文档不一致。文档示例用的是 /usr/src/redis-8.0.6,但你实际解压到了其他目录(如 /data/tools/redis-8.0.6)。

解决

复制代码
# 先用 pwd 确认当前路径
pwd
# 输出 /data/tools/redis-8.0.6(举例)

# 用实际路径拷贝
sudo cp /data/tools/redis-8.0.6/redis.conf /etc/redis/redis.conf

# 或者如果你已经在redis-8.0.6目录下,直接用相对路径
sudo cp redis.conf /etc/redis/redis.conf

建议 :所有涉及源码目录的命令(如 make testmake install)之前,先用 pwd 确认你在正确的目录下。


Q5:编译时报错 jemalloc/jemalloc.h: No such file or directory

复制代码
fatal error: jemalloc/jemalloc.h: No such file or directory

原因:缺少jemalloc头文件,或者之前编译失败有残留文件。

解决

复制代码
# 先装依赖
sudo apt install -y libjemalloc-dev

# 清理残留
make distclean

# 重新编译
make USE_JEMALLOC=yes -j "$(nproc)"

如果jemalloc始终有问题,可以临时换libc:

复制代码
make MALLOC=libc -j "$(nproc)"

但不推荐生产环境长期用libc。


Q6:启动时报错 Cannot assign requested address

复制代码
# Creating Server TCP listening socket *:6379: bind: Cannot assign requested address

原因bind配置的IP地址不存在,或者端口已被占用。

解决 :检查/etc/redis/redis.conf中的bind配置,确保IP是本机网卡的真实IP。如果你只是本地访问,用bind 127.0.0.1就够了,不需要填内网IP。


Q7:Redis被OOM Killer杀掉

现象dmesg | grep -i kill能看到Redis进程被kill。

原因maxmemory没设置或设置过高,导致内存耗尽。

解决

  1. 设置合理的maxmemory(物理内存的70%-80%)
  2. 设置合理的maxmemory-policy
  3. 检查vm.overcommit_memory=1是否生效

Q8:bgsave/RDB持久化失败

日志中可能出现:

复制代码
Can't save in background: fork: Cannot allocate memory

原因:Linux内存overcommit策略导致fork失败。

解决 :确认vm.overcommit_memory=1已设置并生效:

复制代码
sysctl vm.overcommit_memory
# 应该输出 vm.overcommit_memory = 1

Q9:systemd启动失败,提示 /run/redis 目录不存在

原因RuntimeDirectory在旧版systemd(v235之前)不支持RuntimeDirectoryMode,或者服务未正确创建目录。

解决

复制代码
# 手动创建目录并修正权限
sudo mkdir -p /run/redis
sudo chown redis:redis /run/redis
sudo chmod 755 /run/redis

然后在redis.service中确认RuntimeDirectory=redis已配置。如果systemd版本过低,建议升级或改用/var/run/redis并手动创建。


📘 关于ACL的补充说明 :本文档使用了传统的requirepass做全局密码认证,适合大多数单租户场景。Redis 6.0+支持ACL(访问控制列表),可以为不同用户分配不同权限(例如:监控用户只读、应用用户读写、管理员全权),适合多租户或精细化权限管控场景。如需配置ACL,可参考Redis官方ACL文档


总结

从源码编译安装Redis到生产可用,核心就七步:

  1. 装依赖 ------build-essential tcl libssl-dev libjemalloc-dev libsystemd-dev一个不能少
  2. 编译 ------USE_JEMALLOC=yes USE_SYSTEMD=yes BUILD_TLS=yes三个参数开满
  3. 安装到指定目录 ------make install PREFIX=/usr/local/redis/8.0.6,版本化目录方便多版本共存
  4. 配Redis ------复制完整配置,只改3个值requirepassmaxmemorybind注意:配置文件不支持行内注释!
  5. 验配置 ------用--daemonize no前台启动验证,没有输出=成功 ,再用redis-cli ping确认
  6. 托管systemd ------创建 redis.service 文件 → systemctl daemon-reloadsystemctl enablesystemctl start
  7. 调内核+日志 ------vm.overcommit_memory=1 + 全局禁用THP + 配Logrotate + 配Limits

这一套下来,你的Redis至少不会在半夜突然挂掉。


如果觉得有用,欢迎分享给更多运维小伙伴。

你生产环境遇到过最阴间的Redis故障是什么?评论区等你。

相关推荐
爱喝水的鱼丶1 小时前
SAP-ABAP:一次关于“交货日期”的增强需求:从复杂增强到标准功能的回归之旅
运维·开发语言·性能优化·sap·abap·经验交流
运维大师1 小时前
【K8S 运维实战】07-Pod生命周期与故障排查
运维·容器·kubernetes
OpenAnolis小助手1 小时前
龙蜥社区智算联盟发布《智算集群基础设施运维通用技术要求》(附下载链接)
运维·人工智能·智算运维·龙蜥智算联盟
.柒宇.1 小时前
ELK日志分析系统实战指南:Elasticsearch搭建与入门(8.18.8版本)
运维·elk·elasticsearch·logback·日志系统
小刘数字化2 小时前
AR数字孪生:重塑工业运维的下一代交互范式
运维·ar
翰德恩咨询2 小时前
华为DSTE咨询洞察:如何规划人才支撑战略落地
运维·服务器·华为
Linux-187412 小时前
分布式链路追踪系统之二进制安装skywalking
elasticsearch·云原生·skywalking·分布式链路追踪系统·应用程序性能监控
敖行客 Allthinker15 小时前
Parallels Ubuntu虚拟机项目如何让手机访问?完整解决方案
linux·运维·ubuntu
元Y亨H16 小时前
生产环境监控与故障应急处理(5-5-5 标准)指南
运维