乐趣区

关于java:Redis高级RDB持久化

1. 根底

RDB 长久化既能够手动执行,也能够依据服务器配置选项定期执行. 该性能能够将某个工夫点上的数据库状态保留到一个 RDB 文件中。RDB 长久化性能所生成的 RDB 文件是一个通过压缩的二进制文件,通过该文件能够还原生成 RDB 文件时的数据库状态


因为 RDB 文件是保留在硬盘外面的,所以即便 Redis 服务器过程退出,甚至运行 Redis 服务器的计算机停机,但只有 RDB 文件依然存在,Redis 服务器就能够用它来还原数据库状态

2. SAVE 命令和 BGSAVE 命令

有两个 Redis 命令能够用于生成 RDB 文件,一个是 SAVE,另一个是 BGSAVE。
SAVE 命令会阻塞 Redis 服务器过程,直到 RDB 文件创建结束为止,在服务器过程阻塞期间,服务器不能解决任何命令申请:


和 SAVE 命令间接阻塞服务器过程的做法不同,BGSAVE 命令会派生出一个子过程,而后由子过程负责创立 RDB 文件,服务器过程(父过程)持续解决命令申请:

和应用 SAVE 命令或者 BGSAVE 命令创立 RDB 文件不同,RDB 文件的载入工作是在服务器启动时主动执行的,所以 Redis 并没有专门用于载入 RDB 文件的命令,只有 Redis 服务器在启动时检测到 RDB 文件存在,它就会主动载入 RDB 文件。

以下是我执行 save 命令后重新启动 redis 服务控制台打印的信息,能够看到在服务启动的时候回主动加载 RDB 文件

【注意事项】
因为 AOF 文件的更新频率通常比 RDB 文件的更新频率高,所以: 如果服务器开启了 AOF 长久化性能,那么服务器会优先应用 AOF 文件来还原数据
库状态。
只有在 AOF 长久化性能处于敞开状态时,服务器才会应用 RDB 文件来还原数据库状态。
当 SAVE 命令执行时,Redis 服务器会被阻塞,所以当 SAVE 命令正在执行时, 客户端发送的所有命令申请都会被回绝。
只有在服务器执行完 SAVE 命令、从新开始接受命令申请之后,客户端发送的命令才会被解决。
因为 BGSAVE 命令的保留工作是由子过程执行的,所以在子过程创立 RDB 文件的过程中,Redis 服务器依然能够持续解决客户端的命令申请,然而,在 BGSAVE 命令执行期间, 服务器解决 SAVE、BGSAVE、BGREWRITEAOF 三个命令的形式会和平时有所不同。
【留神】
1、bgsave 命令执行时,客户端的 save 命令会被服务器回绝
2、在 bgsave 命令执行时,客户端的 bgsave 也会被回绝
3、bgrewriteaof 和 bgsave 命令不能同时执行

3. 主动间隔性保留

因为 BGSAVE 命令能够在不阻塞服务器过程的状况下执行,所以 Redis 容许用户通过设置服务器配置的 save 选项,让服务器每隔一段时间主动执行一次 BGSAVE 命令。
用户能够通过 save 选项设置多个保留条件,但只有其中任意一个条件被满足,服务器就会执行 BGSAVE 命令。
上面是 redis 的配置文件

下面的默认配置形容如下:
只有满足以下三个条件中的任意一个,BGSAVE 命令就会被执行:
1:服务器在 900 秒之内, 对数据库进行了至多 1 次批改
2:服务器在 300 秒之内, 对数据库进行了至多 10 次批改
3:服务器在 60 秒之内,对数据库进行了至多 10000 次批改

如果咱们想要有其余设置,能够自定义批改其配置规定

4. 主动保留条件

Redis 的服务器周期性操作函数 serverCron 默认每隔 100 毫秒就会执行一次,该函数用于对正在运行的服务器进行保护,它的其中一项工作就是查看 save 选项所设置的保留条件是否曾经满足,如果满足的话,就执行 BGSAVE 命令。

5. RDB 文件构造

(1)REDIS

RDB 文件的最结尾是 REDIS 局部,这个局部的长度为 5 字节,保留着 ”REDIS” 五个字符。通过这五个字符,程序能够在载人文件时,疾速查看所载入的文件是否 RDB 文件。

(2)db\_version

db version 长度为 4 字节,它的值是一个字符串示意的整数,这个整数记录了 RDB 文件的版本号,比方 ”0006”就代表 RDB 文件的版本为第六版。

(3)databases

databases 局部蕴含着零个或任意多个数据库,以及各个数据库中的键值对数据:

(4)EOF

EOF 常量的长度为 1 字节,这个常量标记着 RDB 文件注释内容的完结,当读入程序遇到这个值的时候,它晓得所有数据库的所有键值对都曾经载入结束了。

(5)check\_num

check\_sum 是一个 8 字节长的无符号整数,保留着一个校验和,这个校验和是程序通过对 REDIS、db\_version、databases、EOF 四个局部的内容进行计算得出的。服务器在载人 RDB 文件时,会将载入数据所计算出的校验和与 check\_sum 所记录的校验和进行比照,以此来查看 RDB 文件是否有出错或者损坏的状况呈现。

6. 剖析 RDB 文件

咱们应用 od 命令来剖析 Redis 服务器产生的 RDB 文件,该命令能够用给定的格局转存(dump)并打印输人文件。比如说,给定 - c 参数能够以 ASCII 编码的形式打印输出文件,给定–x 参数能够以十六进制的形式打印输人文件

Linux od 命令用于输入文件内容。
od 指令会读取所给予的文件的内容,并将其内容以八进制字码出现进去。

【数据库为空时的 rdb 文件】

以后是数据状态为空的 RDB 文件,所以只包含四局部,
1:五个字节的标识位 REDIS
2:四个字节的版本号:0006
3:一个字节的 EOF 常量:377(ASCII 码)
4:八个字节的校验和:334 263 C 360 Z 334 362 V

【执行插入命令后的 RDB 文件】


其中黄色框内示意是整数 0,即数据库 0 有数据
其中红色框内:
\0 003 msg 005 hello
\0 示意的是以后数据的类型,0 示意的是字符串
003 示意的 msg 即 Key 的长度,005 示意的是 value 的长度
msg 键,hello 示意值

退出移动版