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 配置文件覆盖了服务运行、数据安全、故障恢复、内存管理和网络访问等多个方面。
本文的核心思路是:
- 使用前台模式运行,方便容器和进程管理;
- 结合 RDB 与 AOF,提升数据恢复能力;
- 使用
everysec平衡 AOF 安全性与性能; - 通过
maxmemory和淘汰策略控制内存; - 通过密码、网络白名单和禁用高风险命令降低风险;
- 使用监控、备份和恢复演练保障生产可靠性。
最后再次提醒:示例中的 admin123 只能用于演示。生产环境应替换为高强度密码,并结合内网隔离、防火墙、ACL 和安全审计共同保护 Redis。