本文目录导读:

在 PHP 项目中选择和配置 Redis 持久化方案,主要取决于你的业务场景、数据容忍度、性能要求以及管理成本。
Redis 提供两种主要持久化方式:RDB(快照) 和 AOF(追加文件),以及混合模式(Redis 4.0+)。
核心区别对比
| 特性 | RDB | AOF |
|---|---|---|
| 原理 | 定期生成全量数据快照(二进制文件) | 记录每个写操作命令(追加到文件末尾) |
| 数据完整性 | 可能丢失最后一次快照后的数据 | 取决 fsync 策略,最多丢失1秒(或更少) |
| 恢复速度 | 非常快(直接加载快照) | 较慢(重放所有命令) |
| 文件大小 | 较小(压缩存储) | 较大(命令冗余,可 rewrite 压缩) |
| 实时性 | 较差(按间隔触发) | 实时(每次/每秒写磁盘) |
| IO 影响 | 快照生成时可能有阻塞(fork + 写时复制) | 持续性写操作,IO 压力较稳定 |
选择策略
纯缓存,容忍少量数据丢失
- 推荐:只开 RDB
- 配置:每 15 分钟或 1 小时生成一次快照
- 原因:性能好,恢复快,不需要 AOF 的实时写入开销
数据库缓存混合(如 Session、排行榜、业务关键数据)
- 推荐:AOF + RDB 混合模式(Redis 4.0+)
- 解释:
aof-use-rdb-preamble yes→ AOF 文件头部存一份 RDB 快照,后续追加增量命令 - 优势:恢复速度接近 RDB,数据安全性接近 AOF
金融、订单等高一致性场景(零容忍丢失)
- 推荐:纯 AOF + everysec fsync
- 禁用 RDB,避免 fork 阻塞(极端场景)
- 注意:性能略低,磁盘 IO 消耗较大
典型配置示例(redis.conf)
# 1. RDB 配置(建议在 AOF 开启时也保留,用于快速恢复)
save 900 1 # 900秒内至少1次修改
save 300 10 # 300秒内至少10次修改
save 60 10000 # 60秒内至少10000次修改
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
# 2. AOF 配置
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec # 推荐:每秒 fsync(最高性能与安全的平衡)
# appendfsync always # 谨慎:每次写都 fsync(极安全但极慢,仅极高一致性场景)
# appendfsync no # 不推荐:交给操作系统决定
# 3. 混合模式(关键!)
aof-use-rdb-preamble yes
# 4. 自动 rewrite(压缩 AOF 文件)
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
PHP 项目中的注意事项
1 不要设置 appendfsync always 除非你确定需要
- PHP 通常作为后端语言,每次请求可能触发多次 Redis 写操作。
always策略会导致每次写都同步磁盘(约 1ms 延迟),QPS 急剧下降。
2 调用 BGREWRITEAOF 避免手动处理
- 在上线大流量场景前执行一次手动 rewrite,避免 AOF 文件过大。
- 可用 PHP 执行 Redis 命令:
$redis->rawCommand('BGREWRITEAOF');
3 监控持久化状态
- 用 Redis INFO 命令检查:
$info = $redis->info(); echo $info['rdb_last_bgsave_time_sec']; // 上次 RDB 耗时 echo $info['aof_last_rewrite_time_sec']; // 上次 AOF rewrite 耗时
4 避免持久化阻塞影响业务
- PHP 连接池大量超时,检查 Redis 是否因
bgsave或bgrewriteaof导致主进程阻塞(内存不足/磁盘慢)。 - 排查方法:
- 看
redis.log中的fork或lag警告 - 用
SLOWLOG GET 10看是否有命令超长
- 看
最终推荐配置模板(通用生产环境)
# 通用推荐:混合模式 + 每秒 fsync appendonly yes appendfsync everysec aof-use-rdb-preamble yes save 900 1 save 300 10 save 60 10000
对应 PHP 业务场景:
- 一般业务数据(如用户信息、商品缓存)
- 可容忍 1 秒内极少量数据丢失(实际上极少发生)
- 恢复速度:接近 RDB(约 10GB 数据恢复 < 2 秒)
你可能不需要持久化的情况
如果你满足以下条件,可以关闭持久化:
- 数据完全来自数据库(如 MySQL/PostgreSQL),Redis 只作缓存
- 即使宕机,数据可以从数据库重建
- 对性能有极致要求(省掉所有 IO 操作)
save "" appendonly no
实战检查清单
- [ ] 确认 Redis 版本 ≥ 4.0(支持混合模式)
- [ ] AOF 文件路径与 RDB 路径是否有足够磁盘空间(至少预估数据量的 2 倍)
- [ ] 是否已配置
stop-writes-on-bgsave-error yes(避免磁盘满时丢失写请求) - [ ] 是否已做
BGREWRITEAOF压力测试(上线或大版本更新后执行一次) - [ ] 生产环境中
/etc/security/limits.conf是否提高了nofile(Redis 可能需要 65535+)
PHP 项目最稳妥的方案是AOF+RDB 混合模式 + everysec fsync,性能接近 RDB,安全性接近 AOF,可满足 99% 的业务场景,如果你遇到具体性能瓶颈或数据丢失场景,可以再针对调整参数。