redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失。幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Append Only File)。
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。
对于RDB来说,提供了三种机制:save、bgsave、自动触发。
Redis Save 命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。文件位置为:/dump.rdb。
执行save命令后会阻塞服务端进程,直到RDB文件创建完毕为止,在整个RDB文件生成过程中服务器不能处理任何命令请求,所以一般情况下我们不会使用save命令触发rdb持久化。
127.0.0.1:6379> save OK
bgsave时Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。
后台保存DB。会立即返回 OK 状态码。 Redis forks, 父进程继续提供服务以供客户端调用,子进程将DB数据保存到磁盘然后退出。如果操作成功,可以通过客户端命令LASTSAVE来检查操作结果
127.0.0.1:6379> bgsave Background saving started 127.0.0.1:6379> lastsave (integer) 1620784097
自动触发是由redis配置文件来完成的。位于redis.conf配置文件中SNAPSHOTTING模块下。
格式:save seconds changes;
save 3600 1 save 300 100 save 60 10000
“save 3600 1”表示如果3600 秒内至少1个key发生变化(新增、修改和删除),则重写rdb文件;
“save 300 100”表示如果每300秒内至少100个key发生变化(新增、修改和删除),则重写rdb文件;
“save 60 10000”表示如果每60秒内至少10000个key发生变化(新增、修改和删除),则重写rdb文件。
不设置save指令,或者给save传入空字符串会禁用。
默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了
默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。
默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
设置快照的文件名,默认是 dump.rdb。
在未启用持久性的实例中删除复制使用的RDB文件。
设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。
# 备份 127.0.0.1:6379> bgsave Background saving started 127.0.0.1:6379> lastsave (integer) 1620786747 # 删除内存中的数据 127.0.0.1:6379> flushdb OK # 查看备份文件位置 127.0.0.1:6379> config get dir 1) "dir" 2) "/" # 上传备份文件到需要还原的Redis的备份文件位置 # 启动redis,备份数据会直接加载 # 可以写成脚本定时执行备份
以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
位于redis.conf中APPEND ONLY MODE模块。
AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)。
默认为no,是否开启AOF
默认为"appendonly.aof",AOP快照文件名
默认为everysec,AOF同步频率设置:
AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制, 当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩, 只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof。
AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),redis4.0版本后的重写,是指上就是把rdb 的快照,以二级制的形式附在新的aof头部,作为已有的历史数据,替换掉原来的流水账操作。
Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。
重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是有一定的负担的,因此设定Redis要满足一定条件才会进行重写。
默认为no,还是会把数据往磁盘里刷,但是遇到重写操作,可能会发生阻塞。(数据安全,但是性能降低)。
如果yes ,不写入aof文件只写入缓存,用户请求不会阻塞,但是在这段时间如果宕机会丢失这段时间的缓存数据。(降低数据安全性,提高性能)。
默认100,设置重写的基准值,文件达到100%时开始重写(文件是原来重写后文件的2倍时触发)。
默认64,设置重写的基准值,最小文件64MB。达到这个值开始重写。
默认yes,指redis在恢复时,会忽略最后一条可能存在问题的指令。默认值yes。即在aof写入时,可能存在指令写错的问题(突然断电,写了一半),这种情况下,yes会log并继续,而no会直接恢复失败。
默认yes,混合持久化就是同时结合RDB持久化以及AOF持久化混合写入AOF文件。这样做的好处是可以结合 rdb 和 aof 的优点, 快速加载同时避免丢失过多的数据,缺点是 aof 里面的 rdb 部分就是压缩格式不再是 aof 格式,可读性差。
一般来说, 如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。
如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。
有很多用户都只使用 AOF 持久化, 但我们并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快, 除此之外, 使用 RDB 还可以避免之前提到的 AOF 程序的 bug 。
Note: 因为以上提到的种种原因, 未来我们可能会将 AOF 和 RDB 整合成单个持久化模型。 (这是一个长期计划。)