redis结构分析——RDB文件

思想

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字节为校验和

你可能感兴趣的:(redis)