Redis生产环境redis-conf配置教程

Redis 生产环境怎么配置?手把手拆解 redis.conf 核心配置

Redis 默认配置可以快速启动服务,但生产环境还需要重点考虑持久化、安全认证、内存淘汰、连接数和故障恢复。本文基于一份完整的 redis.conf,逐项解释这些配置背后的作用,并给出启动验证方法。

本文示例适合学习、测试和内网部署。生产环境使用前,请结合机器内存、网络拓扑、数据重要性和业务访问模式调整。

一、准备工作

假设 Redis 配置目录为:

bash 复制代码
/data/redis/conf

创建配置目录和数据目录:

bash 复制代码
mkdir -p /data/redis/conf
mkdir -p /data
chown -R redis:redis /data/redis /data

如果系统中没有 redis 用户,请根据实际运行用户调整权限。

二、创建 redis.conf

执行下面的命令:

bash 复制代码
cat > /data/redis/conf/redis.conf << 'EOF'
# 基础配置
port 6379
daemonize no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""

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

# 持久化配置 - AOF
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes

# 安全配置
requirepass admin123
masterauth admin123

# 性能优化
maxclients 10000
maxmemory 2gb
maxmemory-policy allkeys-lru

# 网络配置
bind 0.0.0.0
protected-mode yes
tcp-backlog 511
timeout 0
tcp-keepalive 300

# 其他优化
databases 16
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG ""
EOF

检查文件:

bash 复制代码
sed -n '1,240p' /data/redis/conf/redis.conf

三、基础运行配置

1. 端口与进程模式

conf 复制代码
port 6379
daemonize no

Redis 默认监听 9637 端口。多个实例需要使用不同端口。

daemonize no 表示前台运行,适合 Docker、Kubernetes 和 systemd 管理。容器需要主进程保持在前台,日志也可以统一输出到标准输出。

2. PID 与日志

conf 复制代码
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""

notice 是适合生产环境的日志级别。空日志文件名表示输出到标准输出。传统服务器如果需要文件日志,可以改为:

conf 复制代码
logfile "/data/redis/log/redis.log"

四、RDB 持久化

RDB 是 Redis 的快照机制,会在满足条件时生成 dump.rdb

conf 复制代码
save 900 1
save 300 10
save 60 10000

三条规则分别表示:

  • 900 秒内至少有 1 次变化,执行快照;
  • 300 秒内至少有 10 次变化,执行快照;
  • 60 秒内至少有 10000 次变化,执行快照。

多个规则是"或"关系,满足任意一条即可触发。

conf 复制代码
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data

快照失败时停止写入,可以尽早暴露磁盘空间、目录权限或文件系统问题。压缩可以节省磁盘,校验可以帮助发现文件损坏,生产环境通常建议开启。

RDB 文件通常位于:

text 复制代码
/data/dump.rdb

需要确保目录存在、运行用户有写权限,并监控磁盘空间。

五、AOF 持久化

AOF 会记录 Redis 执行过的写命令,通常比 RDB 具有更高的数据恢复精度。

conf 复制代码
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec

appendfsync 常见策略如下:

配置 说明 特点
always 每条写命令同步 安全性最高,性能较低
everysec 每秒同步一次 常见的平衡方案
no 由操作系统决定 性能较高,安全性较低

everysec 发生机器宕机时通常最多丢失约 1 秒内的写入数据。

AOF 重写相关配置:

conf 复制代码
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes

AOF 文件至少达到 64 MB,并且相比上次重写后增长 100% 时,会自动触发重写。AOF 文件末尾不完整时,aof-load-truncated yes 会尝试截断损坏尾部并继续启动,但损坏部分的数据可能无法恢复。

较新的 Redis 版本可能使用多个 AOF 文件和清单文件,实际结构应以数据目录为准。

六、安全配置

1. 密码认证

conf 复制代码
requirepass admin123
masterauth admin123

客户端测试:

bash 复制代码
redis-cli -h 127.0.0.1 -p 6379 -a 'admin123' PING

预期返回:

text 复制代码
PONG

admin123 只能用于演示。生产环境必须替换为高强度随机密码,并避免将密码写入公开脚本或 Shell 历史。

requirepass 控制普通客户端访问,masterauth 用于从节点连接主节点时认证。Redis 新版本还可以使用 ACL 为不同用户配置不同权限。

2. 网络暴露风险

conf 复制代码
bind 0.0.0.0
protected-mode yes

bind 0.0.0.0 表示监听所有网卡,会允许远程连接,但也会扩大攻击面。更安全的方式是绑定内网地址:

conf 复制代码
bind 127.0.0.1 192.168.1.10

如果必须监听所有网卡,应同时配置强密码、云安全组、防火墙白名单,并禁止公网访问 6379。保护模式不能替代网络隔离和访问控制。

七、内存与性能

conf 复制代码
maxclients 10000
maxmemory 2gb
maxmemory-policy allkeys-lru

maxclients 表示最多允许约 10000 个客户端连接,但最终还受到文件描述符限制影响:

bash 复制代码
ulimit -n

maxmemory 2gb 限制 Redis 数据使用的最大内存,但 AOF 重写、RDB fork、复制缓冲区和客户端缓冲区都可能额外占用内存,因此不要把它设置到服务器总内存上限。

allkeys-lru 会从所有 Key 中淘汰最近最少使用的数据,适合缓存场景。常见策略包括:

策略 说明
noeviction 不淘汰,内存不足时写入报错
allkeys-lru 从所有 Key 中淘汰最近最少使用的数据
volatile-lru 只从设置过期时间的 Key 中淘汰
allkeys-lfu 淘汰最不常使用的数据
volatile-ttl 优先淘汰剩余 TTL 较短的数据

如果 Redis 同时存储缓存和重要业务数据,不能简单使用 allkeys-lru,否则重要数据也可能被淘汰。

八、网络与逻辑数据库

conf 复制代码
tcp-backlog 511
timeout 0
tcp-keepalive 300
databases 16

tcp-backlog 控制连接队列大小,高并发场景还会受到操作系统 somaxconn 限制:

bash 复制代码
sysctl net.core.somaxconn

timeout 0 表示不主动关闭空闲连接,连接池场景下通常由客户端管理生命周期。tcp-keepalive 300 用于检测失效长连接。

Redis 默认提供 16 个逻辑数据库,可以通过以下命令切换:

redis 复制代码
SELECT 1

实际业务更推荐使用 Key 前缀区分业务。Redis Cluster 通常只使用数据库 0。

九、禁用高风险命令

conf 复制代码
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG ""

这三行分别禁用当前库清空、所有库清空和动态修改配置,可以降低误操作风险。

但禁用 CONFIG 可能影响运维工具。rename-command 也不是完整的安全方案,生产环境更推荐结合 ACL 做权限分级。

十、启动与验证

以前台方式启动:

bash 复制代码
redis-server /data/redis/conf/redis.conf

检查进程和端口:

bash 复制代码
ps -ef | grep redis-server
ss -lntp | grep 6379

查看服务、内存和持久化状态:

bash 复制代码
redis-cli -h 127.0.0.1 -p 6379 -a 'admin123' INFO server
redis-cli -h 127.0.0.1 -p 6379 -a 'admin123' INFO memory
redis-cli -h 127.0.0.1 -p 6379 -a 'admin123' INFO persistence

验证高风险命令:

bash 复制代码
redis-cli -h 127.0.0.1 -p 6379 -a 'admin123' FLUSHALL

预期返回类似:

text 复制代码
ERR unknown command 'FLUSHALL'

十一、常见问题

1. Redis 无法打开 AOF 文件

检查 /data 是否存在以及运行用户是否拥有写权限:

bash 复制代码
ls -ld /data
chown -R redis:redis /data

2. 远程客户端无法连接

依次检查监听地址、防火墙、云安全组、容器端口映射、客户端密码和网络策略。Redis 监听配置只是网络链路中的一个环节。

3. RDB 和 AOF 是否必须同时开启

不一定。临时缓存可以根据业务容忍度关闭持久化;重要数据则应结合 RDB、AOF、备份和恢复演练。两者同时开启可以兼顾恢复速度与数据完整性,但会增加磁盘 IO 和管理复杂度。

4. maxmemory 2gb 是否代表进程只占用 2 GB

不是。Redis 还可能因为重写、fork、复制缓冲区和内部开销额外占用内存,服务器必须预留余量。

十二、生产环境检查清单

  • 已设置强密码或 Redis ACL
  • Redis 没有直接暴露在公网
  • bind 已限制为内网地址
  • 防火墙和安全组已设置白名单
  • /data 目录权限正确
  • RDB 和 AOF 文件有备份策略
  • 磁盘空间有监控和告警
  • maxmemory 小于服务器实际可用内存
  • 已选择合适的淘汰策略
  • 已评估 maxclients 与文件描述符限制
  • 已确认禁用命令不影响运维工具
  • 已测试 Redis 重启后的数据恢复
  • 已进行故障恢复演练
  • 已固定 Redis 软件或镜像版本

总结

Redis 配置文件覆盖了服务运行、数据安全、故障恢复、内存管理和网络访问等多个方面。

本文的核心思路是:

  1. 使用前台模式运行,方便容器和进程管理;
  2. 结合 RDB 与 AOF,提升数据恢复能力;
  3. 使用 everysec 平衡 AOF 安全性与性能;
  4. 通过 maxmemory 和淘汰策略控制内存;
  5. 通过密码、网络白名单和禁用高风险命令降低风险;
  6. 使用监控、备份和恢复演练保障生产可靠性。

最后再次提醒:示例中的 admin123 只能用于演示。生产环境应替换为高强度密码,并结合内网隔离、防火墙、ACL 和安全审计共同保护 Redis。

相关推荐
SeaTunnel1 小时前
Redis 数据迁移不用写脚本:SeaTunnel 支持 String、Hash、Set、ZSet 四种数据类型
数据库·redis·哈希算法·数据迁移·seatunnel·数据同步
莫得感情 o1 小时前
Redis 11 · 缓存问题:穿透、击穿与雪崩
redis·缓存
晊晌_h1 小时前
嵌入式从0到精通——SQLite3 数据库
数据库·sqlite·sqlite3
海浪仙人掌1 小时前
账龄分析怎么操作?账龄分析实施流程有哪些步骤?
数据库
楚枫默寒1 小时前
Oracle AWR 自动巡检报告
数据库·oracle
吉甫作诵1 小时前
Oracle 19c 常用运维命令大全
运维·数据库·oracle
宗介波妞2 小时前
主站与场站多业务链路通断测试实战指南(电力自动化联调)
网络·数据库
邪修king2 小时前
MySQL数据库(二):操作详解:从创建、查看到备份恢复
数据库·mysql
tryxr2 小时前
Chat2Excel 项目用户服务开发
java·数据库·java项目·用户服务开发