数据持久化到硬盘:一是快照(snapshotting),二是只追加文件(append-only file AOF)



快照

核心原理:redis某个时间内存内的所有数据写入硬盘

场景:redis快照内存里面的数据

1. 用户发送bgsave命令  (此时redis会fork一个子进程,子进程负责生成硬盘文件,父进程负责继续接受命令)
2. 用户发送save命令  (和bgsave命令不同,发送save命令后,到系统创建快照完成之前系统不会再接收新的命令,换句话说save命令会阻塞后面的命令,而bgsave不会)
  例如 :save 60 1000
  满足"60秒内有1000次写入"这个条件,系统就自动调用bgsave,如果配置文件里有多个save命令,只有满足一个就调   用bgsave命令
3.用户发送shutdown,系统会先导员save命令阻塞客户端,然后关闭服务器
4.当有主从架构时,从服务器向主服务器发送sync命令来执行复制操作时,只有主服务器当时没有进行bgsave操作,那么主服务器就会执行bgsave操作



快照的劣势

可能会丢失数据
save 60 1000,如果我在60秒内只更新了800条数据,然后系统崩溃了,那么这800条数据就没了



AOF

核心原理:所有的redis数据写操作的命令记录到硬盘上,这样一来恢复的时候,再执行一次命令就OK了

设置属性:

appendonly no                   

#是否开启aof  
appendfsync everysec  一般使用

#always,everysec,no
always就是每次有一个写命令,就把命令存的硬盘文件里
everysec就是每秒写入硬盘一次
no就是由操作系统来确认什么时候写
no-appendfsync-on-rewrite no

#设置在rewrite的时候是否对新的写操作进行fsync(将缓存中的命令写入硬盘)。no表示进行fsync,yes表示不进行默认是设置为no

aof优势在于:

就算出问题了,最多丢失1秒内的更新数据
aof的劣势:
aof文件的体积可能会很大(可能比快照文件还大),另一方面,系统重启的时候回从aof里读命令,如果aof文件太大,读命令也就要还很久