MessagePack简介及使⽤
什么是MessagePack
官⽅msgpack官⽹⽤⼀句话总结:
It’s like JSON.
橄榄的功效but fast and small.
简单来讲,它的数据格式与json类似,但是在存储时对数字、多字节字符、数组等都做了很多优化,减少了⽆⽤的字符,⼆进制格式,也保证不⽤字符化带来额外的存储空间的增加。以下是官⽹给出的简单⽰例图:
图上这个json长度为27字节,但是为了表⽰这个数据结构,它⽤了9个字节(就是那些⼤括号、引号、冒号之类的,他们是⽩⽩多出来的)来表⽰那些额外添加的⽆意义数据。msgpack的优化在图上展⽰的也⽐较清楚了,省去了特殊符号,⽤特定编码对各种类型进⾏定义,⽐如上图的颐和园英文
网购促销活动A7,其中前四个bit A就是表⽰str的编码,⽽且它表⽰这个str的长度只⽤半个字节就可以表⽰了,也就是后⾯的7,因此A7的意思就是表⽰后⾯是⼀个7字节长度的string。
有的同学就会问了,对于长度⼤于15(⼆进制1111)的string怎么表⽰呢?这就要看messagepack的压缩原理了。
MessagePack的压缩原理
核⼼压缩⽅式可参看官⽅说明messagepack specification
买单英语概括来讲就是:
1. true、fal 之类的:这些太简单了,直接给1个字节,(0xc3 表⽰true,0xc2表⽰fal)
红酒的保质期是多少年b的笔顺2. 不⽤表⽰长度的:就是数字之类的,他们天然是定长的,是⽤⼀个字节表⽰后⾯的内容是什么,⽐如⽤(0xcc 表⽰这后⾯,是个uint 8,⽤
树字成语
oxcd表⽰后⾯是个uint 16,⽤ 0xca 表⽰后⾯的是个float 32)。对于数字做了进⼀步的压缩处理,根据⼤⼩选择⽤更少的字节进⾏存储,⽐如⼀个长度<256的int,完全可以⽤⼀个字节表⽰。
3. 不定长的:⽐如字符串、数组、⼆进制数据(bin类型),类型后⾯加 1~4个字节,⽤来存字符串的长度,如果是字符串长度是256以内的,
只需要1个字节,MessagePack能存的最长的字符串,是(2^32 -1 ) 最长的4G的字符串⼤⼩。
巴顿将军简介4. ⾼级结构:MAP结构,就是k-v 结构的数据,和数组差不多,加1~4个字节表⽰后⾯有多少个项
5. Ext结构:表⽰特定的⼩单元数据。也就是⽤户⾃定义数据结构。
我们看⼀下官⽅给出的stringformat⽰意图