Redis 持久化 RDB 和 AOF
Redis 持久化 RDB 和 AOF Redis本身的机制是 AOF 持久化开启且存在AOF文件时,优先加载AOF文件;AOF 关闭或者AOF文件不存在时,加载RDB文件;加载AOF/RDB文件城后,Redis启动成功;AOF/RDB文件存在错误时,Redis启动失败并打印错误信息 RDB快照持久化 RDB 持久化是通过快照的方式,即在指定的时间间隔内将内存中的数据集快照写入磁盘。在创建快照之后,用户可以备份该快照,可以将快照复制到其他服务器以创建相同数据的服务器副本,或者在重启服务器后恢复数据。RDB是Redis默认的持久化方式 快照持久化 RDB持久化会生成RDB文件,该文件是一个压缩过的二进制文件,可以通过该文件还原快照时的数据库状态,即生成该RDB文件时的服务器数据。RDB文件默认为当前工作目录下的dump.rdb,可以根据配置文件中的dbfilename和dir设置RDB的文件名和文件位置 # 设置 dump 的文件名 dbfilename dump.rdb # 工作目录 # 例如上面的 dbfilename 只指定了文件名, # 但是它会写入到这个目录下。这个配置项一定是个目录,而不能是文件名。 dir ./ 触发快照的时机 执行 save 和 bgsave 命令 配置文件设置 save <seconds> <changes>规则,自动间隔性执行bgsave命令 主从复制时,从库全量复制同步主库数据,主库会执行bgsave 执行 flushall 命令清空服务器数据 执行 shutdown 命令关闭 Redis 时,会执行 save命令 save 和bgsave命令 执行save 和bgsave命令,可以手动触发快照,生成RDB文件,两者的区别如下 使用save 命令会阻塞Redis服务器进程,服务器进程在RDB文件创建完成之前是不能处理任何的命令请求 而使用bgsave 命令不同的是,basave命令会fork一个子进程,然后该子进程会负责创建RDB文件,而服务器进程会继续处理命令请求 fork() 是由操作系统提供的函数,作用是创建当前进程的一个副本作为子进程 fork 一个子进程,子进程会把数据集先写入临时文件,写入成功之后,再替换之前的RDB文件,用二进制压缩存储,这样可以保证RDB文件始终存储的是完整的持久化内容 自动间隔触发 在配置文件中设置 save <seconds> <changes> 规则,可以自动间隔性执行bgsave命令 # SNAPSHOTTING ################################ # # Save the DB on disk: # # save <seconds> <changes> # # Will save the DB if both the given number of seconds and the given # number of write operations against the DB occurred. # # In the example below the behaviour will be to save: # after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed # # Note: you can disable saving completely by commenting out all "save" lines. # # It is also possible to remove all the previously configured save # points by adding a save directive with a single empty string argument # like in the following example: # # save "" save 900 1 save 300 10 save 60 10000 # save <seconds> <changes>表示在seconds秒内,至少有changes次变化,就会自动触发gbsave命令 save 900 1 # 当时间到900秒时,如果至少有1个key发生变化,就会自动触发bgsave命令创建快照 save 300 10 # 当时间到300秒时,如果至少有10个key发生变化,就会自动触发bgsave命令创建快照 save 60 10000 # 当时间到60秒时,如果至少有10000个key发生变化,就会自动触发bgsave命令创建快照 RDB RDB 持久化 执行 rdb 持久化时, Redis 会fork 出一个子进程, 子进程将内存中数据写入到一个紧凑的文件中, 因此它保存的是某个时间点的完整数据。 ...