两种持久化方式:
快照:RDB(Redis DataBase)
在指定的时间间隔内将内存中的数据集完整地生成一个快照,然后保存在硬盘中,也就是RDB文件(二进制格式);当数据要进行恢复的时候,取出RDB文件直接读取到Redis内存中。
快照是如何生成的?
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程不进行任何IO操作,确保了极高的性能。
父子进程共享内存,采用写时拷贝技术,当写数据的时候,才会重新拷贝一份内存给子进程。
配置文件
在配置文件redis.conf中,从下面这段开始往后的一小段都是关于RDB的配置。
- save字段用来设置时间间隔,具体看注释
- dir为./表示dump.rdb的存储位置,不是redis.conf所在的目录,而是你在哪里执行redis-server,就会在哪里生成dump.rdb。可以将dir改为指定目录。
触发Redis生成快照的三种主要方式
- save命令(同步)
执行save命令就可以生成快照,但是不建议使用,因为该命令只管保存,其他操作将会阻塞等save命令执行完。 - bgsave(异步)
执行bgsave命令,在后台生成快照,使用fork()生成redis的一个子进程去完成RDB的生成,但是他的缺点是fork子进程的时候消耗内存。 - 自动
当满足配置文件中的save配置规则时自动生成快照,采用的是bgsave机制。 - 全量复制
在主从复制的时候,主redis会自动生成RDB - debug reload
不清空内存重启,会触发生成RDB - shutdown
客户端执行shutdown命令
使用场景
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,使用RDB方式要比AOF方式更加的高效。
缺点:
- 最后一次持久化的数据可能丢失。因为生成快照是有时间间隔的,所以会导致最后一次数据无法生成快照。
- 耗时、耗性能,因为需要将内存中的数据完整地生成快照写到硬盘中
优点:
- 恢复的时候是直接读取备份文件到内存中,从这个角度看,恢复效率比较高。
- 节省磁盘空间,因为备份文件是压缩过的
写日志:AOF(Append Of File)
把对redis内存数据的任何写操作都写入日志文件中,只许追加文件但不可改写文件。当数据恢复时,读取该文件重新构建数据,即Redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
AOF默认不开启。
配置文件
从下面开始的一小段就是关于AOF的配置。
- 将appendonly设置为yes就开启了。
- 存储位置:和rdb中的dir是同一个位置,也就是共享一个dir配置
- appendfsync:决定了写策略
三种:(1)always:redis执行写命令的时候,是将数据先写入缓冲区,然后写入磁盘,而不是直接写入磁盘;always表示写每条数据都会写入磁盘中;
(2)everysec:每秒写一次到磁盘,而不是一旦有更新操作就写一次aof,这样会导致有可能会丢失一秒的数据;
(3)no:redis不管何时写aof,而是由操作系统决定
如果同时存在rdb和aof,恢复时使用aof。
优缺点:
恢复备份速度慢,比RDB占用更多的磁盘空间。
AOF重写
随着AOF文件的变大,恢复数据的时候会非常慢,因此提出了AOF重写概念。即把重复的、过期的数据等进行优化,从而减少磁盘占用量,加快恢复速度。
当AOF文件过大时,会fork出一个新进程,遍历新进程内存中的数据,来将文件重写,如下图所示。重写aof文件的操作,不会读取旧的aof文,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件。
aof文件是一个二进制文件,并不是像上面的例子一样,直接保存每个命令,而使用Redis自己的格式,下面只是方便演示。
何时重写
重写虽然可以节约大量磁盘空间,减少恢复时间,但是每次重写还是有一定的负担,因此设定redis要满足一定条件才会进行重写:
通过在redis.conf配置文件中的选项no-appendfsync-on-rewrite可以设置是否开启重写,这种方式会在每次fsync时都重写,影响服务器性能,因此默认值为no,不推荐使用。
小结
- RDB持久化保存数据库状态的方法是将键值对数据保存到RDB文件中,而AOF持久化保存数据库状态的方法则是将服务器执行的SET、DELETE、SADD等命令保存到AOF文件中。RDB文件会压缩存储来节约内存,AOF有重写机制来节约内存。
- RDB/RDB文件的载入是在服务器启动时自动执行的,所以Redis没有专门用于载入RDB/RDB文件的命令。
- 读取AOF文件并还原数据库状态的描述图如下:
- 由于AOF文件的更新频率通常比RDB文件的更新频率更高,因此,如果两种方式都开启的话,服务器会优先使用AOF文件来还原数据,只有在AOF方式关闭状态下,服务器才会使用RDB文件来还原数据库状态。但是更新文件的时候,如果两个都开启,则两种文件都会被更新。
如何选择
- 官方推荐两个都启用
- 如果对数据不敏感,可单独使用RDB
- 不建议单独使用AOF,因为可能会有bug
- 如果只是做纯内存缓存,可以都不用