protobuf简介:
简单来讲, ProtoBuf 是结构数据序列化方法,可简单类比于 XML,其具有以下特点:
- 语言无关、平台无关。即 ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台
- 高效。即比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单
- 扩展性、兼容性好。你可以更新数据结构,而不影响和破坏原有的旧程序
使用protobuf背景:
由于推荐系统需要存储大量用户行为数据来丰富用户画像,实时数据必须要存到redis,导致内存资源进制,压缩存储必须要提上日程了!
redis 存储结构
目前使用的是 redis list 数据结构,一个list下200条数据,一条数据占 118 字节 (json格式)
转二进制存储结果对比
1000万条数据测试:
压缩了 58% !(value 结构越复杂越大,效果越好,如果本身就是基础类型,效果不会这么好)
读取效率
压缩后肯定需要压测下读数据,虽然感觉读json和pb差不多,但是还是要用数据说话,直接上结果:
读取 50000条,每条200个元素,总共遍历1000万次 结构转化
结果 protobuf 16秒 FastJson 24秒
protobuf 解析到类居然比 fastjson 解析到类还要快8秒!!!!
结论
protobuf转二进制 除了在控制台看数据吃力些,需要写转换成json ,除此之外没有缺点。
番外
protobuf 还可用在java大类进行网络传输的效率提升,例如 用户画像需要存储的用户维度比较庞大,使用protobuf 会提高不少传输效率