不能,appendfsync always无法真正保证不丢数据,因存在内核page cache缓存、硬盘写缓存未禁用、进程被sigkill强杀于write与fsync之间三重断层,实际最多丢失1条命令;everysec是默认推荐,兼顾可靠性与吞吐;no仅适用于纯缓存或高写压且有外部兜底的场景。

appendfsync always真能保证不丢数据吗?
不能。设成 always 只是让 Redis 每次写命令后立刻调用 fsync(),但实际仍可能丢数据——原因有三:
• Linux 内核 page cache 可能缓存 fsync() 调用本身(尤其 ext4 + barrier 关闭时)
• SSD 或硬盘自身的写缓存未禁用(如未用 hdparm -W0 关闭),fsync() 不代表物理落盘
• Redis 进程被 SIGKILL 强杀时,刚写入缓冲区但还没走到 fsync() 的那条命令就没了
所以它的真实保障是“最多丢 1 条命令”,且前提是硬件、内核、Redis 全链路配合理想——生产环境几乎不存在。
everysec 是默认推荐,但要注意这些细节
everysec 不是严格每 1000ms 刷一次盘,而是靠 Redis 主循环定时器触发,因此容易受主线程阻塞影响:
• 若执行 KEYS *、大 value 序列化等耗时操作,刷盘可能延迟数秒
• no-appendfsync-on-rewrite 默认为 no,即 AOF 重写(bgrewriteaof)期间仍坚持每秒刷盘;若磁盘压力大,建议设为 yes,避免 I/O 雪崩
• 磁盘延迟突增时,Redis 会自动降级为 always 刷盘(由 no-appendfsync-on-rewrite 控制),这个行为容易被忽略
• 吞吐通常比 always 高 5–10 倍,RPO(恢复点目标)为 1 秒,适合绝大多数业务,比如用户行为埋点、实时推荐。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
什么情况下才该用 appendfsync no?
no 表示完全交由操作系统决定刷盘时机(Linux 下通常 30–60 秒),只适合两类场景:
• 纯缓存型用途,比如 session 存储 + 前端兜底,AOF 仅用于故障后重建热 key 分布,不要求精确恢复
• 写压极高且磁盘 I/O 已是瓶颈的节点(如每秒写入 50k+ 小命令,iostat -x 显示 %util > 90)
但必须同步做两件事:
• 关掉所有 save 配置项(避免 bgsave 加剧 fork 延迟)
• 外部必须有兜底机制,比如应用层双写 MySQL 或投递消息队列,否则宕机就是全量丢失
别忘了配套配置和验证动作
appendonly yes 必须开启,否则所有 appendfsync 设置都不生效。
• aof-use-rdb-preamble yes 强烈建议开启,混合持久化可大幅缩短重启加载时间
• auto-aof-rewrite-percentage 100 和 auto-aof-rewrite-min-size 64mb 要合理设置,防止重写太频繁或太滞后
• 开启后务必检查 appendonly.aof 文件是否持续增长,确认日志真实写入(不是空文件或卡住)
• 不要只依赖 AOF:建议保留 RDB 快照(如 save 300 10),作为基础锚点降低 AOF 体积和恢复耗时










