前一章节我们介绍了Redis的持久化RDB,它持久化的数据文件存放在默认文件名为dump.rdb的文件中。本节我们将进行探究RDB文件的格式是怎样的?Redis是如何以二进制的形式来存放数据的?
本节,我们需要查看二级制文件,这里我们使用vim打开文件,然后使用:%!xxd ——将当前文本转换为16进制格式
为了便于演示,我们需要将Redis的所有数据进行清理,使用FLUSHALL命令
127.0.0.1:6379> FLUSHALL
OK
下面,我们来查看清空后的dump.rdb文件的内容信息:
[root@localhost redis]# vim dump.rdb
1 0000000: 5245 4449 5330 3030 38fa 0972 6564 6973 REDIS0008..redis
2 0000010: 2d76 6572 0534 2e30 2e39 fa0a 7265 6469 -ver.4.0.9..redi
3 0000020: 732d 6269 7473 c040 fa05 6374 696d 65c2 s-bits.@..ctime.
4 0000030: bb7b 705b fa08 7573 6564 2d6d 656d c2d8 .{p[..used-mem..
5 0000040: f20c 00fa 0c61 6f66 2d70 7265 616d 626c .....aof-preambl
6 0000050: 65c0 00ff 959b 25ed d596 ecd7 0a e.....%......
我们按照下面的步骤来学习RDB的文件格式:
1、设置一个字符串类型的键值对
127.0.0.1:6379> set name zhang
OK
127.0.0.1:6379> SAVE #手动去触发
OK
查看dump.rdb
1 0000000: 5245 4449 5330 3030 38fa 0972 6564 6973 REDIS0008..redis
2 0000010: 2d76 6572 0534 2e30 2e39 fa0a 7265 6469 -ver.4.0.9..redi
3 0000020: 732d 6269 7473 c040 fa05 6374 696d 65c2 s-bits.@..ctime.
4 0000030: 2d7c 705b fa08 7573 6564 2d6d 656d c218 -|p[..used-mem..
5 0000040: f30c 00fa 0c61 6f66 2d70 7265 616d 626c .....aof-preambl
6 0000050: 65c0 00fe 00fb 0100 0004 6e61 6d65 057a e.........name.z
7 0000060: 6861 6e67 ffe2 a4f3 5923 0905 ed0a hang....Y#....
2、设置一个列表类型的键值对
127.0.0.1:6379> LPUSH list_1 abc def
(integer) 2
127.0.0.1:6379> SAVE
OK
查看dump.rdb
1 0000000: 5245 4449 5330 3030 38fa 0972 6564 6973 REDIS0008..redis
2 0000010: 2d76 6572 0534 2e30 2e39 fa0a 7265 6469 -ver.4.0.9..redi
3 0000020: 732d 6269 7473 c040 fa05 6374 696d 65c2 s-bits.@..ctime.
4 0000030: ba7c 705b fa08 7573 6564 2d6d 656d c2a8 .|p[..used-mem..
5 0000040: f30c 00fa 0c61 6f66 2d70 7265 616d 626c .....aof-preambl
6 0000050: 65c0 00fe 00fb 0200 0e06 6c69 7374 5f31 e.........list_1
7 0000060: 0115 1500 0000 0f00 0000 0200 0003 6465 ..............de
8 0000070: 6605 0361 6263 ff00 046e 616d 6505 7a68 f..abc...name.zh
9 0000080: 616e 67ff e6c6 9389 961d 5536 0a ang.......U6.
3、设置一个哈希的键值对
127.0.0.1:6379> HSET hash_1 k1 v1 k2 v2
(integer) 2
127.0.0.1:6379> save
OK
查看dump.rdb
1 0000000: 5245 4449 5330 3030 38fa 0972 6564 6973 REDIS0008..redis
2 0000010: 2d76 6572 0534 2e30 2e39 fa0a 7265 6469 -ver.4.0.9..redi
3 0000020: 732d 6269 7473 c040 fa05 6374 696d 65c2 s-bits.@..ctime.
4 0000030: 1a7d 705b fa08 7573 6564 2d6d 656d c2f8 .}p[..used-mem..
5 0000040: f30c 00fa 0c61 6f66 2d70 7265 616d 626c .....aof-preambl
6 0000050: 65c0 00fe 00fb 0300 0d06 6861 7368 5f31 e.........hash_1
7 0000060: 1b1b 0000 0016 0000 0004 0000 026b 3104 .............k1.
8 0000070: 0276 3104 026b 3204 0276 32ff 0e06 6c69 .v1..k2..v2...li
9 0000080: 7374 5f31 0115 1500 0000 0f00 0000 0200 st_1............
10 0000090: 0003 6465 6605 0361 6263 ff00 046e 616d ..def..abc...nam
11 00000a0: 6505 7a68 616e 67ff 44fe 70f6 65ad aa90 e.zhang.D.p.e...
12 00000b0: 0a .
4、设置一个集合类型的键值对
127.0.0.1:6379> SADD set_1 v1 v2
(integer) 2
127.0.0.1:6379> SAVE
OK
查看dump.rdb
1 0000000: 5245 4449 5330 3030 38fa 0972 6564 6973 REDIS0008..redis
2 0000010: 2d76 6572 0534 2e30 2e39 fa0a 7265 6469 -ver.4.0.9..redi
3 0000020: 732d 6269 7473 c040 fa05 6374 696d 65c2 s-bits.@..ctime.
4 0000030: 897d 705b fa08 7573 6564 2d6d 656d c2e8 .}p[..used-mem..
5 0000040: f40c 00fa 0c61 6f66 2d70 7265 616d 626c .....aof-preambl
6 0000050: 65c0 00fe 00fb 0400 0205 7365 745f 3102 e.........set_1.
7 0000060: 0276 3202 7631 0d06 6861 7368 5f31 1b1b .v2.v1..hash_1..
8 0000070: 0000 0016 0000 0004 0000 026b 3104 0276 ...........k1..v
9 0000080: 3104 026b 3204 0276 32ff 0e06 6c69 7374 1..k2..v2...list
10 0000090: 5f31 0115 1500 0000 0f00 0000 0200 0003 _1..............
11 00000a0: 6465 6605 0361 6263 ff00 046e 616d 6505 def..abc...name.
12 00000b0: 7a68 616e 67ff bd75 011e 62db 18b3 0a zhang..u..b....
5、设置一个有序集合类型的键值对
127.0.0.1:6379> ZADD zset_1 1 v1 2 v2
(integer) 2
127.0.0.1:6379> SAVE
OK
查看dump.rdb
1 0000000: 5245 4449 5330 3030 38fa 0972 6564 6973 REDIS0008..redis
2 0000010: 2d76 6572 0534 2e30 2e39 fa0a 7265 6469 -ver.4.0.9..redi
3 0000020: 732d 6269 7473 c040 fa05 6374 696d 65c2 s-bits.@..ctime.
4 0000030: d67d 705b fa08 7573 6564 2d6d 656d c2e0 .}p[..used-mem..
5 0000040: f50c 00fa 0c61 6f66 2d70 7265 616d 626c .....aof-preambl
6 0000050: 65c0 00fe 00fb 0500 0004 6e61 6d65 057a e.........name.z
7 0000060: 6861 6e67 0e06 6c69 7374 5f31 0115 1500 hang..list_1....
8 0000070: 0000 0f00 0000 0200 0003 6465 6605 0361 ..........def..a
9 0000080: 6263 ff0c 067a 7365 745f 3117 1700 0000 bc...zset_1.....
10 0000090: 1400 0000 0400 0002 7631 04f2 0202 7632 ........v1....v2
11 00000a0: 04f3 ff0d 0668 6173 685f 311b 1b00 0000 .....hash_1.....
12 00000b0: 1600 0000 0400 0002 6b31 0402 7631 0402 ........k1..v1..
13 00000c0: 6b32 0402 7632 ff02 0573 6574 5f31 0202 k2..v2...set_1..
14 00000d0: 7632 0276 31ff 6e58 21bd a1f1 8c5d 0a v2.v1.nX!....].
从上面的信息可以看出,最前面五个字符是REIDS,REDIS后面四个字符0008表示RDB格式的版本是0008,REDIS008是RDB文件的魔数字符串。魔数字符串后面保存了RDB文件的很多元数据,这里暂不进行说明,后面就是存放的各种数据信息。