2877 字
14 分钟
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:使用 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]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli -p 6379 shutdown
Restart=always
[Install]
WantedBy=multi-user.target

步骤 2:修改核心配置文件(redis.conf#

配置文件默认路径:

  • Ubuntu / Debian/etc/redis/redis.conf
  • CentOS / RHEL/etc/redis/redis.conf/etc/redis.conf
  • 源码编译安装/usr/local/redis/conf/redis.conf

编辑配置文件,修改关键生产参数:

redis.conf 核心配置项
# ======================== 网络与绑定 ========================
# 默认仅监听 127.0.0.1,允许远程或局域网访问需修改为 0.0.0.0 或指定内网 IP
bind 0.0.0.0
# 默认监听端口(6379)
port 6379
# 保护模式:若未设置密码且 bind 0.0.0.0,建议开启 protected-mode 防止公网未授权访问
protected-mode yes
# ======================== 运行模式与进程 ========================
# 是否以守护进程(后台)方式运行(源码编译或独立启动时建议设为 yes;部分 systemd 配置若为 notify 则遵循系统)
daemonize yes
# ======================== 安全认证 ========================
# 强烈建议设置强密码(必须包含大小写字母、数字及特殊符号)
requirepass YourStrongPassword123!
# ======================== 内存与持久化路径 ========================
# 最大内存限制(根据服务器规格配置,如 2GB)
maxmemory 2gb
# 内存淘汰策略(超出限制后优先淘汰过期键)
maxmemory-policy volatile-lru
# 持久化数据文件与工作目录
dir /var/lib/redis

步骤 3:通过 systemctl 管理 Redis 服务#

NOTE
  • Ubuntu / Debian 官方包 服务名称为 redis-server
  • CentOS / RHEL / 源码编译安装 服务名称为 redis
systemctl 服务管理命令
# 1. 重新加载 systemd 配置文件
sudo systemctl daemon-reload
# 2. 设置开机自启动
sudo systemctl enable redis-server # Ubuntu / Debian
# sudo systemctl enable redis # CentOS / RHEL / 自建服务
# 3. 启动 Redis 服务
sudo systemctl start redis-server # Ubuntu / Debian
# sudo systemctl start redis # CentOS / RHEL
# 4. 检查服务运行状态(确认 active (running) 状态)
sudo systemctl status redis-server # Ubuntu / Debian
# sudo systemctl status redis # CentOS / RHEL
# 5. 常用维护命令:停止与重启
sudo systemctl stop redis-server # 停止服务
sudo systemctl restart redis-server # 重启服务

步骤 4:配置防火墙放行 6379 端口#

若需要远程连接 Redis 实例,需在系统防火墙中放行 6379 端口:

1. Ubuntu / Debian 系统(UFW 防火墙)#

UFW 防火墙操作
# 放行 6379 端口(TCP)
sudo ufw allow 6379/tcp
# 重新加载防火墙规则
sudo ufw reload
# 查看放行状态
sudo ufw status

2. CentOS / RHEL / Rocky Linux 系统(Firewalld 防火墙)#

Firewalld 防火墙操作
# 永久放行 6379 端口
sudo firewall-cmd --zone=public --add-port=6379/tcp --permanent
# 重新加载生效
sudo firewall-cmd --reload
# 查看已放行的端口列表
sudo firewall-cmd --list-ports

步骤 5:验证 Redis 版本、运行状态与连接测试#

1. 命令行查看 Redis 安装版本#

查看 Redis 版本命令
# 方式 A:通过 redis-server 查询服务端版本
redis-server -v
# 输出示例:Redis server v=7.2.4 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=5f60d3d5f13702da
# 方式 B:通过 redis-cli 查询客户端版本
redis-cli -v
# 输出示例:redis-cli 7.2.4
# 方式 C:通过包管理器查询
dpkg -l | grep redis # Ubuntu / Debian
rpm -qa | grep redis # CentOS / RHEL

2. 检查端口监听与服务进程#

检查监听端口与进程
# 查看 6379 端口监听状态
sudo ss -tulpn | grep 6379
# 或使用 netstat
sudo netstat -tulpn | grep 6379
# 查看 Redis 进程
ps aux | grep redis-server

3. 连接 Redis 并进行读写测试#

使用官方自带的交互式客户端工具 redis-cli 建立连接并验证:

redis-cli 交互连接与功能测试
# 1. 命令行直连(-h 主机IP, -p 端口, -a 密码)
redis-cli -h 127.0.0.1 -p 6379 -a 'YourStrongPassword123!'
# 或先无密码进入,再通过 AUTH 命令认证:
# redis-cli
# 127.0.0.1:6379> AUTH YourStrongPassword123!

在交互式命令行中执行简单的连通性与读写测试命令:

Redis 交互命令行
127.0.0.1:6379> PING
PONG
127.0.0.1:6379> SET test_key "Hello Redis"
OK
127.0.0.1:6379> GET test_key
"Hello Redis"
127.0.0.1:6379> DBSIZE
(integer) 1
127.0.0.1:6379> INFO server
# Server
redis_version:7.2.4
os:Linux 5.15.0-generic x86_64
arch_bits:64
process_id:1234
tcp_port:6379
uptime_in_seconds:3600
127.0.0.1:6379> EXIT

🐳 二、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 上编辑此页

文章修订历史 (2 次)

查看变更记录
2026/09/01 21:20 a45b064

feat: add new blog posts about Redis and Elasticsearch

2026/08/29 23:29 c746ccb

feat: add new technical posts and update Obsidian workspace configuration

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

💌

发现新文章