zoukankan      html  css  js  c++  java
  • Redis 数据序列化方法 serialize, msgpack, json, hprose 比较

    最近弄 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”:”u5305u542bu4e2du6587”,”abcdu5305u542bu4e2du6587efg”:”abcu4e00u4e8cu4e09u56dbdefg”,”u952eu540d”:{“abc”:{“def”:123,”0”:456,”1”:”abcdu4e2du6587u5185u5bb9efg”},”au4e4bu95f4c”:{“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 序列化后录入

    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 包:
    在这里下载最新版本 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


  • 相关阅读:
    Kafka系列之-Kafka入门
    2018个人年终总结
    javascript 模块化学习:Class打包出来无法实例化问题
    [SqlServer] Error: 15023
    [Auto Testing] 工具准备:Selenium 与 ChromeDriver
    [Python] 模拟登录网站(。。为了之后操作数据。。)
    [Angular 6] 初学angular,环境全部最新,[ ng serve ] 不能启动,卡在 95% 不动 => 解决方案
    [nuget]VS中包管理器打开后找不到其它工程的问题
    当需要给<span>标签设宽度
    关于近期打算
  • 原文地址:https://www.cnblogs.com/zhouzme/p/5758413.html
Copyright © 2011-2022 走看看