BSON

../_images/bson-example.svg

官网: http://bsonspec.org/

BSON 是 MongoDB 文档的存储格式。

和 Json 一样, BSON 也是一种 schema-less 的序列化格式。 如果不追求数据的可阅读性, 还喜欢 Json 的灵活, bson 可以作为一个候选。 另外 bson 修改成本小,比 Json 效率高,扩充了 Json 类型, 支持 DateType、BinData 等。

BSON 协议比较简单。见 http://bsonspec.org/spec.html

基础类型

BSON 基础类型都是固定长度。

类型 占用空间
byte 1 byte (8-bits)
int32 4 bytes (32-bit 有符号整型、补码)
int64 8 bytes (64-bit 有符号整型、补码)
uint64 8 bytes (64-bit 无符号整型)
double 8 bytes (64-bit IEEE 754-2008 浮点数)
decimal128 16 bytes (128-bit IEEE 754-2008 十进制浮点)

变长类型

  1. string: 变长类型和 protobuf 差不多, 普遍采用 length+data 的方式编码
  2. cstring: cstring 是 c 风格字符串, 约定以 0 作为字符串结尾, 不需要长度字段。
  3. binary: 二进制数据。 编码方式为 length(int32) subType(byte) data

key-value

key-value 格式是 json 特色格式, key 是字符串,value可以是多种类型。

编码为: valueType(byte) key(cstring) value

总结

从功能上来说,bson 是json 的扩充。

反序列化效率高

由于基础类型直接是二进制存储,反序列化效率比json高很多。

从存储空间来说, BSON 并不见得比 Json 好

对于字符串类型,json需要额外耗费两个双引号, 而 BSON 也需要额外两字节指定长度和结束字符。

最常用的数值类型 int32 在 bson 中固定耗费 4 字节, 而通常情况下, 小数值(如 1、2)在 json 中只需要存储1字节,甚至 1000 以内的整数也只需要3字节。

对于数组, BSON 内部存储为 {0: xx, 1: xx, 2: xx} , 这也是 BSON 一个值得吐槽的地方。

修改成本很低

BSON 并不属于紧凑类型格式,但固定长度的基础类型带来的好处是修改成本极小。

考虑一个小数字如 1,在 json 字符串中虽然只占用1字节,如果运行期需要修改为 10, 则需要把这个字段后面所有内容都往后移动1位,才能擦除原有值写入 10。

而BSON中是固定长度, 就不会有这种问题,非常适合做修改。

这也是 MongoDB 使用 BSON 的原因, 这个优势是其他序列化方法无法比拟的。

BSON 反序列化快、修改成本小,面向存储的优势极大。