博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis 数据序列化方法 serialize, msgpack, json, hprose 比较
阅读量:5371 次
发布时间:2019-06-15

本文共 3526 字,大约阅读时间需要 11 分钟。

最近弄 Redis ,涉及数据序列化存储的问题,对比了:JSON, Serialize, Msgpack, Hprose 四种方式

1. 对序列化后的字符串长度对比:

测试代码:

$arr = [0, 1, 2, 'a', 'b', 'c', 'd', 'a'=>'12', '包含中文', 'abcd包含中文efg'=>'abc一二三四defg', '键名'=>['abc'=>['def'=>123, 456, 'abcd中文内容efg'], 'a之间c'=>['a'=>123, 'c', 5=>6]]];$str = hprose_serialize($arr);echo 'Hprose: ';echo '
';echo '长度: '. strlen($str);echo '
';echo '内容:'. $str;echo '

';$str = msgpack_pack($arr);echo 'Msgpack: ';echo '
';echo '长度: '. strlen($str);echo '
';echo '内容:'. $str;echo '

';$str = json_encode($arr);echo 'JSON: ';echo '
';echo '长度: '. strlen($str);echo '
';echo '内容:'. $str;echo '

';$str = serialize($arr);echo 'Serialize: ';echo '
';echo '长度: '. strlen($str);echo '
';echo '内容:'. $str;echo '

';

结果:

Hprose:

长度: 196
内容:m11{0011223ua4ub5uc6uds1”a”s2”12”7s4”包含中文”s11”abcd包含中文efg”s11”abc一二三四defg”s2”键名”m2{s3”abc”m3{s3”def”i123;0i456;1s11”abcd中文内容efg”}s4”a之间c”m3{r1;i123;0uc56}}}


Msgpack:

长度: 139
内容:��a�b�c�d�a�12�包含中文�abcd包含中文efg�abc一二三四defg�键名��abc��def{���abcd中文内容efg�a之间c��a{�c


JSON:

长度: 281
内容:
{“0”:0,”1”:1,”2”:2,”3”:”a”,”4”:”b”,”5”:”c”,”6”:”d”,”a”:”12”,”7”:”\u5305\u542b\u4e2d\u6587”,”abcd\u5305\u542b\u4e2d\u6587efg”:”abc\u4e00\u4e8c\u4e09\u56dbdefg”,”\u952e\u540d”:{“abc”:{“def”:123,”0”:456,”1”:”abcd\u4e2d\u6587\u5185\u5bb9efg”},”a\u4e4b\u95f4c”:{“a”:123,”0”:”c”,”5”:6}}}


Serialize:

长度: 321
内容:a:11:{i:0;i:0;i:1;i:1;i:2;i:2;i:3;s:1:”a”;i:4;s:1:”b”;i:5;s:1:”c”;i:6;s:1:”d”;s:1:”a”;s:2:”12”;i:7;s:12:”包含中文”;s:19:”abcd包含中文efg”;s:19:”abc一二三四defg”;s:6:”键名”;a:2:{s:3:”abc”;a:3:{s:3:”def”;i:123;i:0;i:456;i:1;s:19:”abcd中文内容efg”;}s:8:”a之间c”;a:3:{s:1:”a”;i:123;i:0;s:1:”c”;i:5;i:6;}}}


对比结论:

一般情况下,Msgpack < JSON < Serialize 。差距一般在 1~3倍左右,Msgpack 体积非常小

2. 序列化速度对比:

测试代码:

echo 'Begin ~~

';$begin = microtime(true);$bm = memory_get_usage();for ($i = 0; $i <= 100000; $i++) {// $str = hprose_serialize($arr);// $str = msgpack_pack($arr);// $str = serialize($arr); $str = json_encode($arr);}$em = memory_get_usage();echo 'End !

Use Time :';echo microtime(true) - $begin;echo '

Use Mem:';echo ceil(($em - $bm)/1024/1024) .'MB';

测试结果:

Hprose 耗时: 0.435 ~ 0.466

Msgpack 耗时: 0.328 ~ 0.378
Serialize 耗时: 0.496 ~ 0.541
JSON 耗时: 0.431 ~ 0.469


3. 反序列化速度对比

测试代码:

echo 'Begin ~~

';$begin = microtime(true);$bm = memory_get_usage();//$str = hprose_serialize($arr);//$str = msgpack_pack($arr);//$str = serialize($arr);$str = json_encode($arr);for ($i = 0; $i <= 100000; $i++) {// hprose_unserialize($str);// msgpack_unpack($str);// unserialize($str); json_decode($str);}$em = memory_get_usage();echo 'End !

Use Time :';echo microtime(true) - $begin;echo '

Use Mem:';echo ceil(($em - $bm)/1024/1024) .'MB';

测试结果:

Hprose 耗时: 0.553 ~ 0.591

Msgpack 耗时: 0.492 ~ 0.550
Serialize 耗时: 0.496 ~ 0.531
JSON 耗时: 0.852 ~ 0.893


4. Redis 测试:

每次测试清空后添加 两百万 条进队列,查看 Reids info 中 Memory 信息:

a. 初始化空数据时:

这里写图片描述

b. 使用 Msgpack 序列化后录入

Msgpack 序列化内存占用

c. 使用 JSON 编码后录入

JSON 序列化内存占用

d. 使用 Serialize 序列化后录入

Serialize 序列化内存占用

对比结果:

Msgpack 占用内存 385M

JSON 占用内存 660M
Serialize 占用内存 752M
Hprose 我没测试,体积应该在 Msgpack 和 JSON 之间


总结:

速度: Msgpack 速度最快,其次 Serialize, JSON 反序列化速度慢了近一倍

体积: Msgpack 最小,其次 JSON,Serialize 体积最大,一般比 Msgpack 大 1~3 倍。
推荐使用 Msgpack 进行序列化

感觉从各方面来看 Msgpack 都是非常牛逼的,只不过需要自己单独安装 Msgpack 的扩展,不过安装也很简单的。

服务器上可以直接 pecl install msgpack

如果不行的话,就手动下载 tgz 包:
在这里下载最新版本
然后 pecl install msgpack-0.5.6.tgz 即可

之前用 Hprose 时据说他的 PHP Pecl 扩展 hprose_serialize 比 Msgpack 还要快,但今天测试发现比 Msgpack 还要慢一点点,体积也要大一些,不过相对于 PHP 的 serialize 来还是要好一些吧。


测试平台说明:

windows7 x64

I7 4核8线程
内存16G
PHP5.5.19
Redis 2.8.21


转载于:https://www.cnblogs.com/zhouzme/p/5758413.html

你可能感兴趣的文章
第三次作业
查看>>
数据结构--树
查看>>
underline
查看>>
主要日期函数的分类
查看>>
Glide 下载Gif文件
查看>>
全排列
查看>>
c# 对SOAP返回XML字符串的解析方法
查看>>
线程Thread
查看>>
最长公共子串_暴力解法(不会正解)36行
查看>>
摆棋子
查看>>
冲刺二------个人任务
查看>>
[HIve - LanguageManual] Joins
查看>>
unity里的c#
查看>>
UMLl类图实例
查看>>
java随机汉字生成
查看>>
Win7 “Bluetooth设置”对话框无法打开,及无法查找到设备
查看>>
"Coding Interview Guide" -- 在行列都排好序的矩阵中找数
查看>>
Maven与Antx(整理)
查看>>
洛谷P1082同余方程
查看>>
CSS中怎么让DIV居中
查看>>