redis 持久化
redis 持久化 之rdb
(redis会创建fork一个子进程来进行持久化,主进程不再做任何操作,将数据写入到临时文件中,当持久化结束之后,将这个临时文件替换上一次持久化好的文件 ,指定时间将数据存入磁盘中,)
默认自动触发条件 1分钟10000次改值 5分钟10改值 15分钟一次改值
手动触发条件 save bgsave 当对数据完整性要求不高是 rdb比aof更加高效
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快
命令 | save | bgsave |
---|---|---|
io | 阻塞主线程,必须持久化完成才能响应客户端操作 | 异步调用,执行fork操作执行子线程, fork时会阻塞 |
优点 | 不会消耗内存 | 不阻塞客户端命令 |
推荐使用 |
redis 持久化 之aof
记录所有的写操作
rewrite 重写,默认配置上次重写的一倍且大于64M时
三种同步方式
appendfsync always # 同步写入 每次有数据修改发生时都会写入AOF文件。
appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略 ,如果宕机 损失一秒钟的数据。(官方推荐)
appendfsync no #从不同步。高效但是数据不会被持久化。
no-appendfsync-on-rewrite 默认为no (保证数据的安全性)
ppendfsync 意思是append file sync,即当redis执行写操作时是否进行aof文件的同步。这里的appendfsync no的意思是,就算redis有写操作命令进来了,也不会将这些写命令同步写入aof文件,只有执行了命令(如save命令)才会写入文件。aof文件过大就需要重写aof。这里的no-appendfsync-on-rewrite意思是:在重新aof时的aof同步策略,当为yes时,代表相当于重写期间的appendfsync为no,也就是不会把redis的写操作命令写入aof文件,这时候IO阻塞情况就不会太严重,但是为no时,相当于还是按照之前设置的appendfsync那样进行,可能你设置了everysec,这时候在重写aof时,也会把redis的写命令写入aof文件,这就可能会造成IO阻塞
aof | rdb | |
---|---|---|
文件大小 | 远大于rdb 因为是同步写操作 | 文件较小 |
恢复效率 | 恢复效率较aof慢 | 恢复效率高 |
同步效率 | 每秒同步效率较好 | aof不同步效率与rdb相同 |
数据完整性 | 数据完整性强 同步写操作 宕机也就损失一秒,最恶劣情况也只会丢失两秒的数据 | 最后一次数据完整性底数据 |
两种持久化方式可以共存,优先选择aof来恢复数据,因为aof数据完整性更高
#修复异常aof文件
redis-checek-aof --fix
#修复异常dump文件
redis-checek-dump --fix
如果只做缓存。建议两种都可以开启