redis的持久化
由于redis的数据是存储到内存中的,如果服务器一旦断电,内存中的数据将会丢失,为了保证redis中的数据不会丢失,redis提供了持久化技术
也就是将数据保存到文件中。appendonly.aof dump.rdb
redis的持久化有两种方式,一种是RDB,还有AOF
RDB原理
在默认情况下,redis将内存数据库快照保存在名为 dump.rdb 的二进制文件中。由于是二进制文件,所以这个文件相对(AOF)来说比较小
你可以对redis进行设置,让它在 "N秒内数据集至少有M个改动" 这一条件被满足时,自动保存一次数据集
比如说,一分钟内有1000个健被改动过,那么满足这一条件时候,会进行rdb持久化
想要关闭rdb持久化策略,那么在redis.conf 配置文件中注释 save 保存策略注释即可,save保存策略可以配置多个
还可以手动执行命令生成rdb快照,进入redis客户端执行命令save或者bgsave可以生成dump.rdb文件,每次命令执行都会将所有redis内存快照到一个新的
dump文件里,并且覆盖原有的dump文件内容。
bgsave和save的异同点
命令 | save | bgsave |
io类型 | 同步 | 异步 |
是否阻塞redis其他命令 | 是 | 否 |
优点 | 不会消耗额外内存 | 不阻塞客户端命令 |
缺点 | 阻塞客户端命令 | 需要fork子进程,消耗内存 |
默认生成的rdb文件后台使用的是bgsave方式
AOF持久化
RDB持久化有他的缺点,如果因为redis宕机,那么redis将丢失最近写入、且没有保存到快照中的那些数据。为了解决这个痛点,redis引入了一个新的持久化方式,AOF持久化
将修改的每一条redis指令记录进文件appendonly.aof中。由于记录了很多个Redis命令,所以相对来说比较大。
也就是这个文件用来记录你的什么set hset zadd 等修改命令
但是如果你设置了key的过期时间,aof文件并不会记录你的原始过期命令,而是记录key过期的时间戳
在redis.conf文件中可以打开aof配置,appendonly yes
这样的话,当redis重启时就可以读取aof文件恢复数据。那么多久同步一遍redis操作key的命令呢?有三个选项
1.appendfsync always: 每次有新命令追加到AOF文件时就执行一次fsync,非常慢也非常安全
2.appendfsync everysec:每秒同步一次,足够快,并且在故障时只会丢失一秒数据。
3.appendfsync no: 从不 fsync 将数据交给操作系统来处理。更快,也更不安全的选择
推荐也是默认的选择,每秒同步一次。
AOF重写
aof文件里可能有太多没用的指令,比如某个key已经被删除了或者过期了,但是仍然保存当时创建这个key的命令,那么就会浪费空间。
所以aof会定期根据内存的最新数据生成aof文件。
在redis.conf文件中,如下两个配置可以控制aof重写频率
auto-aof-rewrite-min-size 64mb .aof文件至少要达到64mb才会自动重写,文件太小恢复速度本来就很快,重写的意义不大
auto-aof-rewrite-percentage 100 aof文件自上一次重写后文件大小增长了100%则再次触发重写
当然aof还可以手动重写,执行bgrewriteaof重写aof
aof重写会fork一个子进程去做,类似于bgsave,不会对redis读写命令处理有影响
aof和rdb选择哪一个?
建议都启用了,redis启动时候如果既有rdb又有aof,那么redis恢复数据优先选择aof。因为aof一般来说数据更安全。
混合持久化
在redis.conf文件中开启混合持久化,必须先开启aof
aof-use-rdb-preamble yes
如果开启了混合持久化,AOF在重写时,不再是单纯将内存数据转化为redis命令写入aof文件中,而是将重写这一刻之前的内存做RDB快照处理,并且将rdb快照内容和增量
的aof修改内存数据命令存在一起,都写入新的aof文件,新的文件一开始不叫appendonly.aof,等到重写完新的aof文件才会进行改名,覆盖原有的aof文件,完成新旧两个
aof文件的替换。
于是在Redis重启的时候,可以先加载rdb的内容,然后再重放增量的aof日志文件就可以完全替代之前的aof全量文件重放,因此重启效率大幅度得到提升。
redis的混合持久化真的是惊为天人的设计,既保证了速度又保证了数据的安全性,牛逼
Redis数据备份策略
1.先shell定时调度脚本,每小时或者半小时复制一份rdb或者aof文件。
2.每天都保留一份当日的数据备份到一个目录中去,可以保留最近一个月的备份
3.每次copy的时候,都可以把太旧的备份删了
4.每天晚上将当前机器上备份复制一份到其他机器上,以防机器损坏
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?