【Redis】数据持久化
redis是基于内存的数据库,数据如果没有及时更新至磁盘,在系统遭遇故障后,就会造成数据丢失。因此,redis提供了两种数据持久化的方式。分别是AOF和RDB
- AOF(appending only file)
客户端每对数据库做出一次操作,redis就会将操作以命令行的形式存入内核缓冲区的aof文件中,并根据设定的规则,按时将文件中的数据通过系统函数fsync()写回磁盘。
redis对AOF持久化方式提供了三种写回磁盘的时机。
always :每当有新的数据写入文件中,就立即将该数据写回磁盘。因为刷盘的频率最高,所以这种方式的安全性最高,但性能最差。
every second :刷盘的频率为1s,所以安全性和性能都中等。
no :不按照一定的时间间隔刷盘,而是将时机的选择交由操作系统自身来决定,具有随机性。频率最低,因此安全性最低,性能最好
RDB快照
相较于AOF是将数据库的变更以命令行的形式追加到文件中去,RDB采取的是全量复制的形式,而且是以二进制的形式进行数据的复制。也正因为每次复制都是全量复制,因此这种持久化方式的频率要比AOF低很多,但是因为是以二进制的形式存储数据,相较于AOF每次恢复的时候还需要执行命令,RDB恢复数据的时候就会快很多,直接读取即可。
redis针对RDB同样也提供了两种持久化模式。
- 同步操作:由主线程来完成数据的复制操作,备份期间,由于主线程去忙其他任务了,所以期间到来的任务没有办法得到及时处理。
- 异步操作:创建一个子线程,由子线程异步地来完成数据复制。子线程会先复制主线程的页表,然后,根据页表,映射到内存