*Redis 生产环境安装指南

原文:https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/ 翻译整理:Kimi


本文介绍如何在生产环境中正确安装和配置 Redis,确保服务稳定、安全、可维护。

*生产环境安装方式选择

场景 推荐方式 说明
Ubuntu/Debian 服务器 APT 包管理 官方仓库,自动更新,systemd 集成
Rocky/AlmaLinux 服务器 RPM 包管理 官方仓库,自动更新,systemd 集成
需要最新功能或自定义编译 源码编译 最大灵活性,需手动维护
容器化部署 Docker 隔离性好,适合微服务架构
快速测试/开发 Docker 或包管理 快速启动,易于清理

*生产环境安装步骤(以 Ubuntu 为例)

*1. 系统准备

# 更新系统
sudo apt-get update && sudo apt-get upgrade -y

# 安装必要工具
sudo apt-get install -y curl gnupg lsb-release

# 配置时区
sudo timedatectl set-timezone Asia/Shanghai

# 配置 NTP
sudo apt-get install -y chrony
sudo systemctl enable chrony
sudo systemctl start chrony

*2. 安装 Redis

# 添加官方仓库
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
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

# 安装
sudo apt-get update
sudo apt-get install -y redis

*3. 创建专用用户

sudo useradd -r -s /bin/false -M redis
sudo usermod -aG redis redis

*4. 创建目录结构

sudo mkdir -p /var/lib/redis
sudo mkdir -p /var/log/redis
sudo mkdir -p /var/run/redis
sudo mkdir -p /etc/redis
sudo chown -R redis:redis /var/lib/redis
sudo chown -R redis:redis /var/log/redis
sudo chown -R redis:redis /var/run/redis
sudo chmod 750 /var/lib/redis
sudo chmod 750 /var/log/redis

*5. 配置 Redis

编辑 /etc/redis/redis.conf:

# 基础配置
bind 127.0.0.1 ::1          # 仅监听本地(如需远程访问,改为内网IP)
port 6379
protected-mode yes

# 进程管理
daemonize no                # systemd 管理时设为 no
supervised systemd
pidfile /var/run/redis/redis-server.pid

# 日志
loglevel notice
logfile /var/log/redis/redis-server.log

# 数据目录
dir /var/lib/redis

# 持久化 - RDB
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb

# 持久化 - AOF(推荐生产环境启用)
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 内存管理
maxmemory 2gb
maxmemory-policy allkeys-lru

# 安全
requirepass YourStrongPassword123!
# 或使用 ACL(Redis 6+)
# aclfile /etc/redis/users.acl

# 客户端连接
maxclients 10000
timeout 300
tcp-keepalive 300

# 慢查询日志
slowlog-log-slower-than 10000
slowlog-max-len 128

# 内核优化提示(需手动配置系统)
# vm.overcommit_memory = 1
# transparent_hugepage = never

*6. 配置 systemd 服务

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

[Unit]
Description=Redis In-Memory Data Store
After=network.target
Documentation=http://redis.io/documentation, man:redis-server(1)

[Service]
Type=notify
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf --supervised systemd --daemonize no
ExecStop=/usr/bin/redis-cli -a YourStrongPassword123! shutdown
ExecReload=/bin/kill -s HUP $MAINPID
Restart=always
RestartSec=5
User=redis
Group=redis

# 资源限制
LimitNOFILE=65536
LimitNPROC=4096

# 安全加固
NoNewPrivileges=true
ProtectSystem=true
ProtectHome=true
ReadWritePaths=/var/lib/redis /var/log/redis /var/run/redis

[Install]
WantedBy=multi-user.target

*7. 系统内核优化

# 编辑 /etc/sysctl.conf
sudo tee -a /etc/sysctl.conf <<EOF
# Redis 优化
vm.overcommit_memory = 1
vm.swappiness = 1
net.core.somaxconn = 65535
EOF

sudo sysctl -p

# 禁用透明大页
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag

# 持久化透明大页设置
cat <<EOF | sudo tee /etc/rc.local
#!/bin/bash
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
EOF
sudo chmod +x /etc/rc.local

*8. 防火墙配置

# UFW (Ubuntu)
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow from 10.0.0.0/8 to any port 6379  # 仅允许内网访问
sudo ufw enable

# firewalld (Rocky/AlmaLinux)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port protocol="tcp" port="6379" accept'
sudo firewall-cmd --reload

*9. 启动服务

sudo systemctl daemon-reload
sudo systemctl enable redis
sudo systemctl start redis
sudo systemctl status redis

*10. 验证安装

# 测试连接
redis-cli -a YourStrongPassword123! ping
# 应返回 PONG

# 查看服务器信息
redis-cli -a YourStrongPassword123! info server

# 检查持久化
redis-cli -a YourStrongPassword123! info persistence

# 检查内存
redis-cli -a YourStrongPassword123! info memory

# 测试保存
redis-cli -a YourStrongPassword123! save
ls -lh /var/lib/redis/dump.rdb

*安全配置清单

  • 设置强密码(requirepass 或 ACL)
  • 限制绑定地址(bind)
  • 启用保护模式(protected-mode yes)
  • 配置防火墙,仅允许可信 IP 访问
  • 禁用危险命令或重命名(rename-command)
  • 启用 TLS(如需加密传输)
  • 配置日志审计
  • 定期更换密码

*监控配置

*启用 Redis 监控

# 延迟监控
redis-cli -a YourStrongPassword123! config set latency-monitor-threshold 100

# 启用统计
redis-cli -a YourStrongPassword123! config set activedefrag yes

*集成外部监控

  • Prometheus + Grafana:使用 redis_exporter
  • Zabbix:使用 Zabbix Redis 模板
  • Datadog/NewRelic:使用官方集成
  • 自建脚本:定期执行 redis-cli info 并上报

*备份策略

*自动备份脚本

创建 /usr/local/bin/redis-backup.sh:

#!/bin/bash
BACKUP_DIR="/backup/redis"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR

# 触发 RDB 保存
redis-cli -a YourStrongPassword123! SAVE

# 复制 RDB 文件
cp /var/lib/redis/dump.rdb $BACKUP_DIR/dump.rdb.$DATE

# 压缩
gzip $BACKUP_DIR/dump.rdb.$DATE

# 保留最近 7 天的备份
find $BACKUP_DIR -name "dump.rdb.*" -mtime +7 -delete

# 可选:上传到远程存储
# aws s3 cp $BACKUP_DIR/dump.rdb.$DATE.gz s3://your-bucket/redis-backups/
sudo chmod +x /usr/local/bin/redis-backup.sh

*配置 cron 定时任务

# 每小时备份
0 * * * * /usr/local/bin/redis-backup.sh >> /var/log/redis-backup.log 2>&1

# 每天全量备份到远程
0 2 * * * /usr/local/bin/redis-backup-remote.sh

*高可用部署

生产环境建议部署 Redis Sentinel 或 Redis Cluster:

  • Sentinel:适合读写分离、故障自动转移场景(1 主 + N 从 + 3 Sentinel)
  • Cluster:适合数据分片、水平扩展场景(至少 3 主 + 3 从)

详细配置请参考 Redis Sentinel 高可用指南 和 Redis 集群指南。

*日志轮转

创建 /etc/logrotate.d/redis:

/var/log/redis/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 redis redis
    sharedscripts
    postrotate
        /bin/kill -SIGUSR1 $(cat /var/run/redis/redis-server.pid 2>/dev/null) 2>/dev/null || true
    endscript
}

*性能基线

部署完成后,建立性能基线:

# 基准测试
redis-benchmark -h 127.0.0.1 -a YourStrongPassword123! -t set,get -n 100000 -q

# 记录基线数据
redis-cli -a YourStrongPassword123! info stats > /var/log/redis/baseline-$(date +%Y%m%d).txt