Redis是内存数据库,如果不将内存的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库也会消失。所以Redis提供了持久化功能。
1.1、简介
内存:高效、断电(关机、内存数据会丢失)
硬盘:读写速度慢于内存,断电数据不会丢失
1.2、RDB(Redis DataBase)
RDB:是Redis默认的持久化机制。RDB相对于照快照,保存的是一种状态。
快照:将内存中的数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb
优点:
- 快照保存数据极快、还原数据极快
- 适用于灾难备份
- 适合大规模的数据恢复。
- 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。
缺点:
- 小内存机器不适合使用,RDB机制符合要求就会快照
- 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了,那么将丢失最后一次的数据。
- 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍),最后再将临时文件替换之前的备份文件。
1.3、RDB的触发机制
触发RDB持久化分为手动触发和自动触发
1.3.1、自动触发RDB快照
1 在指定的时间间隔内,执行指定次数的写操作(即key值发生变化,读操作不改变key值)
2 执行save(阻塞, 只管保存快照,其他的等待) 或者是bgsave (异步)命令
3 执行flushall 命令,清空数据库所有数据,意义不大。
4 执行shutdown 命令,保证服务器正常关闭且不丢失任何数据。
1.3.2、手动触发
- save:阻塞当前Redis的服务器,直到RDB过程完成。
- bgsave:Redis进程执行fork操作子进程,由子进程负责RDB持久化,阻塞只发生在fork阶段(极其短的时间)
1.3.3、save与bgsave
命令 | save | bgsave |
---|---|---|
IO类型 | 同步 | 异步 |
是否阻塞 | 是 | 是(阻塞发生在fork) |
优点 | 不会消耗额外内存 | 不阻塞客户端命令、父进程不进行I/O操作 |
缺点 | 阻塞客户端命令 | 需要fork子进程,消耗内存 |
2.1、AOF(Append only File)
AOF持久化会记录服务器执行的所有写操作命令(写入至appendonly.aof),并在redis重启的时候,通过回访AOF文件来还原数据集,文件使用append-only的默认,所有操作都会追加到文件的末尾。当AOF文件体积超出保存数据集状态的情况下,会进行一个重写(rewrite)操作,确保文件不会太大。通常情况下,AOF文件保存的数据及会比RDB文件保存的数据集更完整。
1、AOF的优点
AOF可以更好的保障数据不丢失,默认情况下AOF会每隔一秒,通过一个后台线程执行一次fsync操作,所以最多只会丢失1秒的数据,AOF日志文件已append-only模式写入,没有任何磁盘寻址的开销,性能非常高,即使文件损坏了。也可以通过redis提供的工具进行修复。当AOF文件过大的时候,会在后台进行重写,确保日志文件不会过大。
2、 AOF的缺点
同一份数据,通常AOF会比RDB文件更大,AOF开启后,支持的写QPS会比RDB的低,因为AOF一般设置为每秒fsync一次日志文件,其次在数据恢复的时候,会比较慢,做冷备不太适合。
每
2.2、AOF的触发机制
- 修改同步always:同步持久化,每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性较好
- 每秒同步ervrysec:异步操作,每秒记录,如果一秒内宕机,则数据丢失
- no:从不同步
命令 | always | everysec | no |
---|---|---|---|
优点 | 不丢失数据 | 每秒一次fsync丢失一秒数据 | 不用管 |
缺点 | IO开销较大 | 丢失一秒数据 | 不可控 |