Redis持久化方式
redis有rdb和aof两种方式,如果没有设置持久化方式,数据就只在内存中,redis重启后就全部丢失了
rdb
不定期的异步方式保存到磁盘上:半持久化方式
是将redis在内存中的数据定时dump到硬盘上,实现数据持久化
在规定的时间间隔内将内存中的数据集快照写入磁盘,实际操作是fork一个子进程,先将数据集写入到临时文件中,写入成功后再替换之前的文件,再用二进制压缩存储,此操作是一种间隔存储,类似于快照的一种方式
aof
把每一次变化都写入到append only file中 全持久化方式
将redis操作日志以追加的形式写入到文件中,记录的是操作记录(查询操作不记录)
Redis中提供了三种同步策略:
每秒同步、 每修改同步、 不同步
每秒执行一次同步、 每次命令都同步、 由OS决定什么时候同步
优点:不丢数据、每秒一次fsync、不用管
缺点:IO开销大、丢1s数据、不可控
事实上,每秒同步也是异步完成的,其效率也是非常高的,缺点是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。至于无同步,无需多言
二者的优缺点对比:
rdb的优势:
整个数据库只有一个文件(dump.rdb),很简单,且出现灾难性故障后恢复较容易(可以轻易的将一个单独的压缩文件转义到其他存储介质上去),且极大的减少了IO,只需要fork一个子进程,然后由子进程完成持久化工作,当数据集很大时,rdb方式启动效率和IO消耗都有很大的优势
rdb缺点:
因为是隔一段时间保存一次,所有对于不能容忍丢失数据的场景是不能接受的,因为RDB是通过fork子进程来协助完成数据持久化工作的当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟
aof的优势:
数据安全性更高,即使出现宕机,也不会破坏已经日志文件中已经存在的内容。且aof文件中格式更清洗,更易于理解(其记录了所有的修改操作)
aof的缺点:
数据量级相同,aof的文件要更大,所以恢复速度会慢一些,且根据同步策略的不同,aof在运行效率上会慢于rdb
当 Redis 重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整
怎样取舍:最好两种都用啦
看是否能接受数据丢失吧,能承受一定的数据丢失,rdb方式是比较好的选择
定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,除此之外,使用RDB还可以避免AOF程序的bug
adb性能好,但可能丢数据,aof更安全、数据更完整,两个都配置了优先加载aof