redis结构分析——RDB文件

思想

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_MS1byte252,说明是带过期时间的键值对
ms8bytes以毫秒为单位的时间戳
TYPE8bytes以毫秒为单位的时间戳
key———
value———

TYPE值

名称说明
RDB_TYPE_STRING0字符串
RDB_TYPE_LIST1
RDB_TYPE_SET2
RDB_TYPE_ZSET3
RDB_TYPE_HASH4
RDB_TYPE_HASH_ZIPMAP9
RDB_TYPE_LIST_ZIPLIST10
RDB_TYPE_SET_INTSET11
RDB_TYPE_ZSET_ZIPLIST12
RDB_TYPE_HASH_ZIPLIST13
RDB_TYPE_LIST_QUICKLIST14
  • 不带过期期时间
    去掉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对象结构、
  • 无压缩
lenstring
  • 压缩
RDB_ENC_LZFcompressed_lenorigin_lencompressed_string

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

3.列表对象RDB_TYPE_LIST

list_lengthitem1item2itemn

举例:

35“hello”5“world”1“!”

4.集合对象RDB_TYPE_SET

set_sizeitem1item2itemn

举例:

35“hello”5“world”1“!”

5.有序集合对象RDB_TYPE_ZSET

set_sizeitem1score1itemnscoren

举例:

32“pi”4“3.14”1“e”2“2.7”

6.哈希集合对象RDB_TYPE_HASH

hash_sizek1_sizek1v1_sizev1k2_sizek2v2_sizev2..kn_sizeknvn_sizevn

举例:

21“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字节为校验和
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值