• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Redis存取序列化与反序列化性能问题详解

    1. 问题场景

    我们在使用Redis的时候经常会将对象序列化存储到Redis中,在取出的时候进行反序列化,如果对象过大在进行序列化和反序列化的时候会有一定性能问题。今天查看了CSRedis源码发现在Set和Get的时候是支持Byte[]类型,那么问题来了如果我们将对象转换成Byte[]类型进行存储是否会比序列化和反序列化操作快了?

    2. 问题验证

    2.1. 编写一个简单实例进行验证

      ListUser> list = new ListUser>();
      for (int i = 0; i  1000; i++)
      {
       User user = new User() { Id = i, Name = "张三", Age = 11 };
       list.Add(user);
      }
      Stopwatch stopwatch = new Stopwatch();
      stopwatch.Start(); // 开始监视代码运行时间
    
      //使用序列化
      rds.HSet("test2", "test2", list);
      var list1 = rds.HGetListUser>>("test2", "test2");
    
      //使用byte方式
      //rds.HSet("test", "test1", ObjectToBytes(list));
      //var list2 = BytesToObject(rds.HGetbyte[]>("test", "test1"));
    
      stopwatch.Stop(); // 停止监视
      TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间
      double hours = timespan.TotalHours; // 总小时
      double minutes = timespan.TotalMinutes; // 总分钟
      double seconds = timespan.TotalSeconds; // 总秒数
      double milliseconds = timespan.TotalMilliseconds;
      Console.WriteLine(+hours + " " + minutes + " " + seconds + " " + milliseconds);
      Console.ReadKey();

    对象转换成Byte,和Byte转成对象公用方法。

     /// summary> 
     /// 将一个object对象序列化,返回一个byte[]   
     /// /summary> 
     /// param name="obj">能序列化的对象/param>   
     /// returns>/returns> 
     public static byte[] ObjectToBytes(object obj)
     {
      byte[] buff;
      using (MemoryStream ms = new MemoryStream())
      {
       IFormatter iFormatter = new BinaryFormatter();
       iFormatter.Serialize(ms, obj);
       buff = ms.GetBuffer();
      }
      return buff;
     }
    
     /// summary> 
     /// 将一个序列化后的byte[]数组还原   
     /// /summary>
     /// param name="Bytes">/param>   
     /// returns>/returns> 
     public static object BytesToObject(byte[] Bytes)
     {
      using (MemoryStream ms = new MemoryStream(Bytes))
      {
       IFormatter formatter = new BinaryFormatter(); return formatter.Deserialize(ms);
      }
     }

    注意点:两种方式要分开执行!!!

    2.2 响应结果

    序列化操作响应时间:

    Byte操作响应时间:

    我们可以明显看到Byte速度要快于序列化操作,并且Redis获取值没有问题

    我们借助Redis客户端工具来看看Redis里面存储的内容:

    首先是序列化的内容

    然后是Byte的内容

    这只是一个简单的测试,后续我还会结合项目实际情况进行测试。如果有写的不对地方欢迎各位指出问题。

    总结

    到此这篇关于Redis存取序列化与反序列化性能问题的文章就介绍到这了,更多相关Redis存取序列化与反序列化性能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    上一篇:Redis为什么快如何实现高可用及持久化
    下一篇:Redis3.2.11在centos9安装与卸载过程详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Redis存取序列化与反序列化性能问题详解 Redis,存取,序列化,与,反,