Redis 数据序列化方法 serialize, msgpack, json, hprose 比较

释放双眼,带上耳机,听听看~!

Redis 数据序列化方法 serialize, msgpack, json, hprose 比较

  • 07net01.com 发布于 2015-07-13 16:15:21 
  • 分类:IT技术
  • 阅读(375)
  • 评论

最近弄 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 
'<br>'; 
echo 
'长度: '. strlen(
$str); 
echo 
'<br>'; 
echo 
'内容:'. 
$str; 
echo 
'<hr>'; 
$str = msgpack_pack(
$arr); 
echo 
'Msgpack: '; 
echo 
'<br>'; 
echo 
'长度: '. strlen(
$str); 
echo 
'<br>'; 
echo 
'内容:'. 
$str; 
echo 
'<hr>'; 
$str = json_encode(
$arr); 
echo 
'JSON: '; 
echo 
'<br>'; 
echo 
'长度: '. strlen(
$str); 
echo 
'<br>'; 
echo 
'内容:'. 
$str; 
echo 
'<hr>'; 
$str = serialize(
$arr); 
echo 
'Serialize: '; 
echo 
'<br>'; 
echo 
'长度: '. strlen(
$str); 
echo 
'<br>'; 
echo 
'内容:'. 
$str; 
echo 
'<hr>';

结果:

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 ~~<br><hr><br>'; 
$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 !<br><hr><br>Use Time :'; 
echo microtime(
true) – 
$begin; 
echo 
'<br><hr><br>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 ~~<br><hr><br>'; 
$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 !<br><hr><br>Use Time :'; echo microtime(
true) – 
$begin; echo 
'<br><hr><br>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 序列化后录入

c. 使用 JSON 编码后录入

d. 使用 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 包: 
在这里下载最新版本 https://pecl.php.net/package/msgpack 
然后 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


版权声明:本文为博主原创文章,未经博主允许不得转载。

关键词:中文

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索