2人参与 • 2026-03-20 • Redis
单节点redis问题:
redis数据备份文件,也被叫做redis数据快照,就是把内存中所有数据都记录到磁盘,当redis实例故障重启后,从磁盘读取快照文件恢复数据
——主动宕机会自动执行一次rdb
save //由redis主进程执行rdb,会阻塞所有命令 bgsave //开启子进程执行rdb,避免主进程受到影响
redis内部有触发rdb的机制,可以在redis.conf文件找到:
redis配置文件中的rdb持久化规则 save 900 1 # 900秒(15分钟)内,如果至少有1个key被修改,则执行bgsave save 300 10 # 300秒(5分钟)内,如果至少有10个key被修改,则执行bgsave save 60 10000 # 60秒(1分钟)内,如果至少有10000个key被修改,则执行bgsave 禁用rdb持久化(生产环境慎用) save ""
rdb的其他配置也可以在redis.conf文件设置:
# rdb持久化压缩配置(默认开启,建议不开启,压缩会消耗cpu,磁盘不值钱) rdbcompression yes # 是否压缩rdb文件,yes开启压缩,no关闭压缩 # rdb文件名称配置 dbfilename dump.rdb # rdb文件的名称 # rdb文件保存目录配置 dir ./ # rdb文件保存的目录路径
bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据,完成fork读取内存数据并写入rdb文件
fork采用copy-on-write技术:
rdb方式bgsave基本流程:
rdb执行时机:
默认是服务停止时
rdb的缺点:
因为是记录命令,aof文件比rdb文件大,而且aof会记录对同一个key的多次写操作,但只有最后一次写操作才有意义
——执行bgrewriteaof命令,可以让aof文件执行重写功能,用最少命令达到相同效果
aof默认关闭,需要修改redis.conf配置文件来开启aof
# aof持久化开关 appendonly yes # 是否开启aof功能,默认是no # aof文件名称 appendfilename "appendonly.aof" # aof文件的名称
aof的命令记录的频率也可以通过redis.conf文件配置
//表示每执行一次写命令,立即记录到aof文件 appendfsync always //写命令执行完先放入aof缓冲区,然后每个1秒将缓冲区数据写到aof文件(默认)3 appendfsync everysec //写命令执行完先放入aof缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
| 策略 | 配置值 | 同步时机 | 数据安全 | 性能影响 | 适用场景 |
|---|---|---|---|---|---|
| always | appendfsync always | 每次写命令后立即同步 | 最高(零丢失) | 最低(性能差) | 金融交易、支付系统 |
| everysec | appendfsync everysec | 每秒同步一次(默认) | 较高(最多丢失1秒) | 中等(推荐) | 大多数生产环境 |
| no | appendfsync no | 由操作系统决定(通常30秒) | 最低(可能丢失>30秒) | 最高(性能最好) | 缓存、非关键数据 |
redis会在触发阈值时自动去重写aof文件,阈值可在redis.conf中配置
//aof文件比上次文件增长超过多少百分比则触发重写 auto-aof-rerite-percentage 100 //aof文件体积最小多大以上才触发重写 auto-aof-rerite-min-size 64mb
aof和rdb各有优缺点,如果对数据安全性要求高,在实际开发中会结合两者使用
| 对比维度 | rdb | aof |
|---|---|---|
| 持久化方式 | 定时对整个内存做快照 | 记录每一次执行的命令 |
| 数据完整性 | 不完整,两次备份之间会丢失 | 相对完整,取决于刷盘策略 |
| 文件大小 | 会有压缩,文件体积小 | 记录命令,文件体积很大 |
| 宕机恢复速度 | 很快 | 慢 |
| 数据恢复优先级 | 低,因为数据完整性不如aof | 高,因为数据完整性更高 |
| 系统资源占用 | 高,大量cpu和内存消耗(fork子进程) | 低,主要是磁盘io资源但aof重写时会占用大量cpu和内存资源 |
| 使用场景 | 可以容忍数分钟的数据丢失,追求更快的启动速度 | 对数据安全性要求较高常见 |
单节点redis的并发能力有上限,要进一步提高redis的并发能力需要搭建主从集群,实现读写分离.
搭建方式存储于文件redis集群.md下
通过master判断slave是不是第一次来同步数据需要掌握两个重要概念:
一、主从第一次同步是全量同步:

结合两个重要概念后:

全量同步流程:
二、主从第一次同步是全量同步,但如果slave重启后同步则执行增量同步

注意:repl_baklog大小上限,写满后会覆盖最早的数据。如果slave断开时间过久,导致尚未备份的数据被覆盖,则无法基于log做增量同步,只能再次全量同步
优化redis主从集群方案:

全量同步和主从同步的区别:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论