redis结构分析——RDB文件

23 阅读4分钟

2016-04-18 09:43:26

思想

RDB相当于快照(snapshot)没有相应的日志记录功能 ##RDB文件结构

名称大小说明
REDIS5bytes固定值,存放'R','E','D','I','S'
RDB_VERSION4bytesRDB版本号
databases——存储真正的数据
REDIS_RDB_OPCODE_EOF1byte255(0377),表述数据库结束
checksum——校验和
##databases结构
名称大小说明
:-------------:-------------::-----
RDB_OPCODE_SELECTDB1byte254,读到它时,接下来要读数据库的号
db_number1,2,5bytes存储数据库的号码,根据号码大小调大小
key_value_pairs——主要数据
举例:
REDISRDB_VERSIONSELECTDB0pairsSELECTDB3pairsEOFchecksum
:-------------:-------------::-----:-------------:-------------::-----:-------------::-----
##key_value_pairs结构
  • 带过期时间 | 名称| 大小| 说明| | :--------- |:-------------:| :-----| |RDB_OPCODE_EXPIRETIME_MS |1byte| 252,说明是带过期时间的键值对| |ms |8bytes| 以毫秒为单位的时间戳| |TYPE|8bytes| 以毫秒为单位的时间戳| |key|———| 键| |value|———| 值|

TYPE值 | 名称| 值| 说明| | :--------- |:-------------| | RDB_TYPE_STRING |0| 字符串|
|RDB_TYPE_LIST |1 |
|RDB_TYPE_SET | 2 |
| RDB_TYPE_ZSET |3 |
| RDB_TYPE_HASH |4 |
| RDB_TYPE_HASH_ZIPMAP |9 |
|RDB_TYPE_LIST_ZIPLIST |10 |
| RDB_TYPE_SET_INTSET |11 |
| RDB_TYPE_ZSET_ZIPLIST |12 |
| RDB_TYPE_HASH_ZIPLIST |13 |
| RDB_TYPE_LIST_QUICKLIST | 14 |

  • 不带过期期时间 去掉RDB_OPCODE_EXPIRETIME_MS和ms

##value对象部分分析

###1.字符串对象 RDB_TYPE_STRING 字符串对象是长度小于32,用RDIS_ENCODING_INT类型保存 否则用RDIS_ENCODING_RAW ####RDIS_ENCODING_INT 对象结构

ENCODINGinteger
  • ENCODING: REDIS_RDB_ENC_INT8,REDIS_RDB_ENC_INT16,REDIS_RDB_ENC_INT32 其中一个 ####2.RDIS_ENCODING_RAW对象结构、

  • 无压缩 | len |string| | :--------- |:-------------|

  • 压缩 | RDB_ENC_LZF |compressed_len|origin_len|compressed_string| | :--------- |:-------------|:------------------|

    RDB_ENC_LZF=3表示开启了LZF字符压缩算法

3.列表对象RDB_TYPE_LIST

| list_length |item1|item2|...|itemn| | :--------- |:-------------|

举例: | 3 |5|“hello”|5|“world”|1|“!”| | :--------- |:-------------|

###4.集合对象RDB_TYPE_SET | set_size |item1|item2|...|itemn| | :--------- |:-------------|

举例: | 3 |5|"hello"|5|"world"|1|"!"| | :--------- |:-------------| ###5.有序集合对象RDB_TYPE_ZSET | set_size |item1|score1|...|itemn|scoren| | :--------- |:-------------|

举例: | 3 |2|"pi"|4|"3.14"|1|"e"|2|"2.7"| | :--------- |:-------------| ###6.哈希集合对象RDB_TYPE_HASH | hash_size |k1_size|k1|v1_size|v1|k2_size|k2|v2_size|v2|..|kn_size|kn|vn_size|vn| | :--------- |:-------------|

举例: | 2 |1|“a”|5|“apple”|1|“b”|6|"banana"| | :--------- |:-------------|

##RDB文件具体分析

1.无数据的RDB文件

127.0.0.1:6379> FLUSHALL
9737:M 18 Apr 11:06:48.335 * DB saved on disk
OK
127.0.0.1:6379> SAVE
9737:M 18 Apr 11:06:59.704 * DB saved on disk
sun@sun-pc:~$ od -c dump.rdb
0000000   R   E   D   I   S   0   0   0   7 372  \t   r   e   d   i   s
0000020   -   v   e   r  \v   9   9   9   .   9   9   9   .   9   9   9
0000040 372  \n   r   e   d   i   s   -   b   i   t   s 300   @ 372 005
0000060   c   t   i   m   e 302   S   O 024   W 372  \b   u   s   e   d
0000100   -   m   e   m 302 370 220  \f  \0 377   C   r 227 036   F 332
0000120   R   l
0000122

###2.有数据的RDB文件

127.0.0.1:6379> FLUSHALL
9737:M 18 Apr 11:25:34.688 * DB saved on disk
OK
127.0.0.1:6379> set msg "hello"
OK
127.0.0.1:6379> save
9737:M 18 Apr 11:25:50.574 * DB saved on disk
OK

127.0.0.1:6379> QUIT
sun@sun-pc:~$ od -c dump.rdb
0000000   R   E   D   I   S   0   0   0   7 372  \t   r   e   d   i   s
0000020   -   v   e   r  \v   9   9   9   .   9   9   9   .   9   9   9
0000040 372  \n   r   e   d   i   s   -   b   i   t   s 300   @ 372 005
0000060   c   t   i   m   e 302 276   S 024   W 372  \b   u   s   e   d
0000100   -   m   e   m 302 310 222  \f  \0 376  \0 373 001  \0  \0 003
0000120   m   s   g 005   h   e   l   l   o 377 243 006 365   < 357 004
0000140  \r   k
0000142

\0 :代表REDIS_RDB_STRING, 003:msg长度,005:hello 长度

  • 有过期时间的RDB文件
sun@sun-pc:~$ redis-cli
127.0.0.1:6379> FLUSHALL
9737:M 18 Apr 11:31:30.420 * DB saved on disk
OK
127.0.0.1:6379> SETEX msg 10086 "hello"
OK
127.0.0.1:6379> save
9737:M 18 Apr 11:33:16.016 * DB saved on disk
OK
127.0.0.1:6379> QUIT
sun@sun-pc:~$ od -c dump.rdb
0000000   R   E   D   I   S   0   0   0   7 372  \t   r   e   d   i   s
0000020   -   v   e   r  \v   9   9   9   .   9   9   9   .   9   9   9
0000040 372  \n   r   e   d   i   s   -   b   i   t   s 300   @ 372 005
0000060   c   t   i   m   e 302   {   U 024   W 372  \b   u   s   e   d
0000100   -   m   e   m 302 370 223  \f  \0 376  \0 373 001 001 374   4
0000120 306  \a   (   T 001  \0  \0  \0 003   m   s   g 005   h   e   l
0000140   l   o 377 326 037 274   X 353   n 362 037
0000153
  • 数字以8进制显示

  • REDIS0007:RDB文件标志和版本号

  • 372 结束符

  • redis-bit:redis的位数64或32

  • resdis-ver999.999.999:redis服务版本为999.999.999

  • ctime :时间戳 8字节

  • used-mem:redis使用内存的大小

  • 374:RDB_OPCODE_EXPIRETIME_MS占8字节

  • 377 EOF常量

  • 最后8字节为校验和