2016-04-18 09:43:26
思想
RDB相当于快照(snapshot)没有相应的日志记录功能 ##RDB文件结构
| 名称 | 大小 | 说明 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| REDIS | 5bytes | 固定值,存放'R','E','D','I','S' | ||||||||
| RDB_VERSION | 4bytes | RDB版本号 | ||||||||
| databases | —— | 存储真正的数据 | ||||||||
| REDIS_RDB_OPCODE_EOF | 1byte | 255(0377),表述数据库结束 | ||||||||
| checksum | —— | 校验和 | ||||||||
| ##databases结构 | ||||||||||
| 名称 | 大小 | 说明 | ||||||||
| :------------- | :-------------: | :----- | ||||||||
| RDB_OPCODE_SELECTDB | 1byte | 254,读到它时,接下来要读数据库的号 | ||||||||
| db_number | 1,2,5bytes | 存储数据库的号码,根据号码大小调大小 | ||||||||
| key_value_pairs | —— | 主要数据 | ||||||||
| 举例: | ||||||||||
| REDIS | RDB_VERSION | SELECTDB | 0 | pairs | SELECTDB | 3 | pairs | EOF | checksum | |
| :------------- | :-------------: | :----- | :------------- | :-------------: | :----- | :-------------: | :----- | |||
| ##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 对象结构
| ENCODING | integer |
|---|
-
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字节为校验和