2014 字
10 分钟
Linux 环境下 Redis 安装部署全指南:指定版本安装、Docker 容器化对比与高频避坑实战
本文详细介绍了高性能内存数据库 Redis 在 Linux 环境下的部署配置实践,解析 Redis 6.x/7.x 核心演进,演示官方源精确锁定与源码编译安装流程,深度对比 Docker 容器化与传统部署优劣,并重点剖析无密码裸奔导致挖矿木马入侵、protected-mode 远程阻拦、AOF/RDB 持久化 Fork 阻塞、内存淘汰策略缺失等八大高频大坑。

📌 什么是 Redis?#

Redis(Remote Dictionary Server)是由 Salvatore Sanfilippo 开源的高性能键值对(Key-Value)内存数据库。它支持字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)、位图(Bitmap)、HyperLogLog、地理空间(GEO)以及流(Stream)等丰富的数据结构。

由于数据常驻于物理内存,Redis 单节点读写性能可轻松达到 10W+ QPS。它支持 RDB 快照AOF 日志 两种持久化机制,广泛应用于分布式系统中的数据高速缓存、分布式锁、会话共享、高并发计数器、排行榜及发布订阅消息系统


🛠️ 一、Linux 系统中安装指定版本 Redis#

Redis 演进迅速:

  • Redis 6.x:引入多线程 I/O 模型、更细粒度的 ACL 安全权限控制、RESP3 协议。
  • Redis 7.x:引入 Redis Functions(替代传统 eval Lua)、ACL 2.0、多分片 Cluster 优化与更高效的内存分配。

方法 1:使用 Redis 官方仓库安装指定版本(推荐)#

1. Ubuntu / Debian 系统#

Ubuntu / Debian 终端
# 1. 导入官方 GPG 密钥
sudo apt install -y lsb-release curl gpg
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
# 2. 添加官方 APT 源
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
# 3. 更新并检索版本
sudo apt update
apt-cache madison redis-server
# 4. 安装指定版本(例如 7.2.4)
sudo apt install -y redis-server=6:7.2.4-1rl1~jammy1
sudo apt-mark hold redis-server

2. CentOS / RHEL / Rocky Linux 系统#

CentOS / RHEL 终端
# 安装 EPEL 与 Remi 源(提供最新全量 Redis 版本)
sudo yum install -y epel-release
sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
# 启用指定版本模块(如 redis:7.2)
sudo dnf module reset redis -y
sudo dnf module enable redis:remi-7.2 -y
# 安装 Redis
sudo yum install -y redis

方法 2:源码编译安装(任意指定精确版本)#

Redis 由纯 C 语言编写且无复杂的第三方外部依赖,源码编译速度极快(通常 1 分钟内完成)。

系统终端
# 1. 安装编译工具
sudo apt install -y build-essential tcl # Ubuntu
# sudo yum install -y gcc make tcl # CentOS
# 2. 下载指定版本源码包(以 7.2.4 为例)
wget https://download.redis.io/releases/redis-7.2.4.tar.gz
tar -zxvf redis-7.2.4.tar.gz
cd redis-7.2.4
# 3. 编译并指定安装目录
make -j$(nproc)
sudo make PREFIX=/usr/local/redis install
# 4. 复制配置文件
sudo mkdir -p /usr/local/redis/conf /usr/local/redis/data
sudo cp redis.conf /usr/local/redis/conf/

配置 Systemd 服务 /etc/systemd/system/redis.service

/etc/systemd/system/redis.service
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=root
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli -p 6379 -a 'YourStrongPassword123!' shutdown
Restart=always
[Install]
WantedBy=multi-user.target
系统终端
sudo systemctl daemon-reload
sudo systemctl start redis
sudo systemctl enable redis

🐳 二、Linux 下使用 Docker 快速部署 Redis#

1. docker run 单行命令运行#

Docker 终端
docker run -d \
--name redis-server \
-p 6379:6379 \
-v /opt/redis/data:/data \
-v /opt/redis/redis.conf:/etc/redis/redis.conf \
--restart unless-stopped \
redis:7.2-alpine \
redis-server /etc/redis/redis.conf

2. docker-compose.yml 规范化编排#

docker-compose.yml
version: '3.8'
services:
redis:
image: redis:7.2-alpine
container_name: redis-cache
restart: always
ports:
- "6379:6379"
volumes:
- ./data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
environment:
- TZ=Asia/Shanghai

⚖️ 三、Docker 部署 vs 传统宿主机部署优劣对比#

评估维度Docker 容器化部署传统宿主机/裸机部署 (APT/源码编译)
部署便利性秒级部署,结合 Alpine 镜像仅约 30MB 体积极快,源码编译仅需几十秒
内存管理与内核特性⚠️ 在容器内需额外配置宿主机 overcommit_memory 与 THP(透明大页)🌟 原生直接生效,方便直接对 Linux 内存子系统进行内核级参数调优
网络延迟与 QPS经过 Docker 容器虚拟网桥会有极微小网络延迟(微秒级)🚀 极限零损耗,发挥物理网卡最高吞吐
数据持久化管理严格依赖宿主机挂载目录(Volume),AOF 文件落地正常数据存放在本地文件系统,配合外部快照备份更原生
NOTE

选型决策建议

  • 应用缓存、会话存储、微服务架构:推荐选用 Docker Redis
  • 极限 QPS 场景(如每秒数十万并发读写的大型核心集群):推荐 宿主机原生编译部署 并优化宿主机内核参数。

⚠️ 四、新手最容易犯错的关键坑点与解决方案#


💣 坑点 1:不设密码且开放 0.0.0.0 导致服务器沦为挖矿肉鸡(严重安全事故)#

现象#

云服务器 CPU 长期 100% 飙满,出现不明挖矿进程(如 kdevtmpfsi),~/.ssh/authorized_keys 中被写入了陌生公钥。

核心原因#

很多新手在 redis.conf 中把 bind 127.0.0.1 注释掉,但没有设置 requirepass 密码。黑客通过公网 6379 端口直接使用 CONFIG SET dir /root/.sshCONFIG SET dbfilename authorized_keys 将恶意 SSH 公钥写入宿主机,直接拿到服务器 root 权限!

解决方案#

CAUTION

永远不要在公网运行未设密码的 Redis 实例!

  1. 设置强密码:在 redis.conf 中配置 requirepass YourComplexPassword!2026
  2. 禁止 root 运行,使用非特权 redis 用户。
  3. 禁用危险命令(生产防内鬼防提权):
    redis.conf
    rename-command FLUSHALL ""
    rename-command FLUSHDB ""
    rename-command CONFIG "MY_SECRET_CONFIG_CMD"

💣 坑点 2:开启远程连接报 DENIED Redis is running in protected mode#

现象#

外部客户端连接时报错:DENIED Redis is running in protected mode because protected mode is enabled...

核心原因#

Redis 的**保护模式(protected-mode)**在未配置密码且没有绑定具体 IP 时会强制激活,拒绝任何来自非本地回环网络的请求。

解决方案#

redis.conf 中同时完成两项配置:

redis.conf
# 1. 允许所有网卡监听
bind 0.0.0.0
# 2. 设置访问密码
requirepass YourStrongPassword123!
# 3. (可选)关闭保护模式
protected-mode no

💣 坑点 3:物理内存未耗尽却抛出 OOM 崩溃(vm.overcommit_memory 限制)#

现象#

Redis 日志中出现警告:WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.,随后在执行 BGSAVE(RDB)或 BGREWRITEAOF 时进程被系统强杀。

核心原因#

执行持久化时,Redis 会调用操作系统的 fork() 创建子进程(利用 Copy-on-Write 机制)。当 Linux 系统的 vm.overcommit_memory0 时,内核若评估剩余可用物理内存不足以应对最坏情况下的内存复制,就会拒绝 fork 分配。

解决方案#

修改宿主机 Linux 内核参数:

系统终端
# 临时生效
sudo sysctl vm.overcommit_memory=1
# 永久生效
echo "vm.overcommit_memory = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

💣 坑点 4:内存写满后服务瘫痪(未配置 maxmemory 与淘汰策略)#

现象#

Redis 数据量暴增,内存占满后所有写入命令抛出报错:OOM command not allowed when used memory > 'maxmemory'

核心原因#

默认配置下,Redis 没有限制最大内存占用(在 64 位系统下为无限使用直到耗尽服务器全部物理内存),且默认淘汰策略为 noeviction(写满直接报错拒绝写入)。

解决方案#

根据服务器实际内存规格,在 redis.conf 中明确限定最大内存与 LRU / LFU 淘汰算法:

redis.conf
# 设置最大可用内存(如 2GB)
maxmemory 2147483648
# 配置数据淘汰策略(推荐 volatile-lru 或 allkeys-lru)
maxmemory-policy allkeys-lru

💣 坑点 5:THP(透明大页)导致延迟毛刺与内存膨胀#

现象#

Redis 读写延迟偶尔发生几十毫秒的严重抖动,日志提示:WARNING you have Transparent Huge Pages (THP) support enabled in your kernel...

核心原因#

Linux 默认开启的 Transparent Huge Pages 在 fork 写入时分配 2MB 大页,会显著增加内存复制开销并导致慢查询。

解决方案#

禁用 Linux 系统的透明大页特性:

系统终端
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled

📋 五、生产环境通用优化配置模板(redis.conf#

/etc/redis/redis.conf
# === 网络与安全 ===
bind 0.0.0.0
port 6379
protected-mode yes
requirepass YourSuperStrongPassword!2026
timeout 300
tcp-keepalive 300
# === 进程与守护 ===
daemonize no # Docker 容器中必须为 no;传统后台运行设为 yes
supervised systemd
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
# === 内存与淘汰策略 (以 4GB 机器为例) ===
maxmemory 3221225472 # 约 3GB
maxmemory-policy allkeys-lru
# === RDB 快照持久化 ===
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
dbfilename dump.rdb
dir /var/lib/redis
# === AOF 增量持久化 (高可靠性推荐启用) ===
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec # 每秒刷盘,兼顾性能与安全
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# === 客户端连接与慢查询 ===
maxclients 10000
slowlog-log-slower-than 10000 # 超过 10 毫秒记录慢查询
slowlog-max-len 1000

🎯 总结速查#

  1. 安全第一准则
    • 生产环境严禁不设密码裸奔!严禁在公网随意暴露默认 6379 端口。
  2. 生产上线避坑清单
    • 配置高强度 requirepass 密码;
    • 显式配置 maxmemory 上限与 maxmemory-policy 淘汰策略;
    • 在 Linux 内核开启 vm.overcommit_memory = 1
    • 关闭系统 Transparent Huge Pages(THP);
    • 开启 AOF appendfsync everysec 实现秒级数据防丢。

这篇文章是否对你有帮助?

发现错误或想要改进这篇文章?

在 GitHub 上编辑此页
Linux 环境下 Redis 安装部署全指南:指定版本安装、Docker 容器化对比与高频避坑实战
作者
YUME
发布于
2026-05-28
许可协议
CC BY-NC-SA 4.0

💌

发现新文章