前一章节我们介绍了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文件的很多元数据,这里暂不进行说明,后面就是存放的各种数据信息。