一、简介
我们都知道Redis是基于内存的非关系型数据库,基于内存那他的数据是怎么持久化的呢,这篇文章将对Redis的数据持久化进行学习,Redis提供了两种数据持久化的方式
- RDB(Redis Database)
RDB将会创建数据快照在声明的时间间隔内,根据快照恢复数据 - AOF (Append-Only File)
AOF方法会记录服务器接收到的每个写操作。AOF文件可以每秒更新一次,也可以在每次写入时更新一次,从而允许通过重放这些操作来重建数据库,直至故障点。
Redis支持两种持久化方式同时存在,也可以关闭数据持久化当他只需要作为缓存来使用的时候。
二、RDB
配置文件
# dir: /xx/xxx //Redis工作路径
# logfile: "redis.log" //日志存放路径
-----------------------------RDB相关--------------------------------
# save "" //RDB是默认开启的,如果需要关闭RDB,放一个空string
//redis RDB的默认配置,可以自己配置频率,一般默认即可
# save 3600 1 //1h内至少有一个key更改触发
# save 300 100 //300s内有100个key更改触发
# save 60 10000 //60s内有10000个key更改触发
#rdbcompression yes //压缩dump文件,默认是开启的。压缩的好处是节省了磁盘,缺点是对CPU有一定的消耗
#dbfilename dump.rdb //配置dump文件的名称
RDB有两种方式保存快照,分别是bgsave和save,保存成功后会生成备份文件dump.rdb,redis启动的时候会读取这个备份文件。
save
使用SAVE命令的时候,redis会使用主进程来执行保存操作,期间不能进行读写,当数据量大的时候会造成阻塞。Redis停机的时候自动进行一次SAVE
。
bgsave
后台异步执行,开启子进程执行命令,主进程不受影响,适合在Redis运行过程中使用。Redis会根据上面的配置来执行bgsave
问题:备份执行是根据配置的频率来执行的,在两次命令执行期间如果服务崩溃,有可能数据会丢失。所以这里引出第二种持久化方式AOF
扩展:bgsave执行原理
bgsave开始会fork主进程得到子进程(阻塞的,但耗时比较短),子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件。在写入磁盘的过程中,主进程会采用copy-on-write的技术来防止冲突。
三、AOF
将redis服务端接收到的命令都追加写到文件中,默认是关闭的。
配置文件
appendonly no //默认是关闭的
appendfilename "appendonly.aof"//aof文件名称
# appendfsync always//每一次写都记录,数据最安全但性能会更差
appendfsync everysec//每一秒钟记录
# appendfsync no//将内存写道缓存区,由操作系统决定何时将缓冲区内容写到磁盘
auto-aof-rewrite-percentage 100 //比上次文件增长超过百分比触发重写
auto-aof-rewrite-min-size 64mb //体积超过多少才触发重新写
bgrewriteaof命令可以重写简化aof文件,减少文件大小。可以通过auto-aof-rewrite-percentage、auto-aof-rewrite-min-size来控制触发条件。
注意:在开启AOF的时候,先执行一次bgrewriteaof命令,将存量的数据写到aof在重启服务,防止数据丢失
。并且修改配置的时候建议都做好dump文件的备份。
四、总结
RDB和AOF有各自的优缺点,实际使用中往往会结合两者来使用。当两者都开启的时候,Redis会优先采用可靠性更高的AOF文件来加载数据。