当前位置: 首页 > 网络应用技术

Java高性能序列化工具Kryo序列化

时间:2023-03-07 16:01:33 网络应用技术

  Kryo是一个快速的序列化/反序列化工具,取决于字节代码生成机制(ASM库在底部使用),因此它在序列速度中具有一定的优势,但是由于此,它的使用只能是限制基于useJVM的语言。

  与Hessian类似,Kryo序列化的结果是其自定义和唯一格式。因为其序列化结果是二进制的,也就是说,字节[],可以存储像Redis这样的二进制数据的存储引擎可以直接存储可以直接序列化的数据。当然,您还可以选择以字符串形式存储在其他存储引擎(性能丢失)中。

  我介绍了很多,让我们看一下Kryo的基本用法。实际上,对于序列化框架,API基本上是相同的。毕竟,参数和参数的导出通常是确定的(序列化对象/序列化的结果)。在使用Kryo之前,我们需要引入相应的依赖性。

  基本使用如下所示

  KRYO类将自动执行序列化。输出类和输入类负责处理缓冲区字节并写入流中。

  如果序列化和后序列化类的字段不一致,则衍生化将失败。

  作为灵活的序列化框架,Kryo不在乎读取数据。作为开发人员,您可以使用Kryo随意提供的盒子使用的串行化器。

  像许多其他序列化框架一样,Kryo提供了一个注册的序列化对象类,以提供性能并减少序列化结果的量。当注册时,它将为序列化类生成int ID,然后使用int ID来识别此信息在序列化时输入。注册方式如下:

  或者

  您可以清楚地指定一个INT ID ID,但是ID必须大于或等于0。如果未提供,则INTER将由INT ++生成以维护有序的INT ID。

  Kryo支持各种序列化,我们可以通过源代码看到一两个

  具体参考?“ Kryo支持的序列化类型”

  尽管Kryo提供的序列化器可以读写大多数对象,但开发人员可以轻松地制定其自己的序列化器。在这里没有解释长度限制,仅将默认序列化器用作示例。

  在新版本的Kryo中,该对象不会默认引用它。这意味着,如果对象多次出现在一个对象中,则将其编写多次,并且深化序列将被转换为多个不同的对象。

  例如,当打开参考属性时,每个对象首次出现在对象图中,并且在记录期间将写入varint。自那时以来出现相同的对象时,只会记录一个varint才能实现节省空间的目标。尽管此举节省了序列化空间,但这是一种利用时间来改变空间的做法,这将影响序列化的性能。这是因为在编写/读取对象时需要跟踪它们。

  开发人员可以使用Kryo的自我设定setReferences方法来确定是否启用了Kryo的参考功能。

  如果在序列化之前的setReferences(false),则将setReferencences(true)设置为后场,将失败。

  Kryo不是线程-SAFE.EAT线程应具有自己的Kryo对象,输入和输出实例。

  因此,在多线程环境中,您可以考虑使用螺纹网或对象池以确保线程安全性。

  螺纹网是一个典型的牺牲空间,以换取并发安全性。它将为每个线程创建一个特殊的Kryo对象。对于每个线程的每个Kryo对象,都可以按顺序实现,因此自然避免并发安全问题。创建方法如下:

  之后,您只需要通过kryos.get()方法从线程上下文中取出对象。

  “池塘”是一个非常重要的编程想法。连接池,线池,对象池等都是

  通过保存在某个“容器”中创建的“对象”,以便避免创建和破坏产生的绩效损失,从而实现了“重用”想法的表现,从而可以使用它。改善整体性能。

  Kryo对象池的原理是相同的。Kryo框架与对象池的实现有关。整个使用过程无非是创建池,从池中获取对象并返回对象。以下是代码的实例。

  创建Kryo池时,需要传递三个参数。第一个参数用于指定其是否在池中同步。如果将其指定为true,则可以通过多个线程访问它。第三参数适用于指定的对象池的大小。这两个参数易于理解,因此重点是第二个参数。

  如果将第二个参数设置为true,则Kryo池将使用java.lang.ref.softreference将其用于存储对象。当JVM的内存压力很大时,允许池中的对象恢复垃圾。软引用,表明所有物体已被垃圾回收。,免费池将尝试删除一个空引用。

  创建Kryo池后,使用Kryo变得非常简单。只需调用kryopool.obtain()方法。使用后,请致电Kryopool.free(Kryo)返回对象,并完成完整的租赁使用。

  从理论上讲,只要对对象池的大小进行正确评估,它就可以完美地解决并发安全问题的问题。以下代码

  与JDK的序列化方法相比,Kryo的性能更快,并且由于Kryo允许多个参考和周期参考,因此存储费用也较小。

  但是,尽管Kryo的性能非常好,但它已经放弃了许多特征,例如线程安全性和串行对象字段的现场修改。尽管可以通过Kryo的良好可伸缩性来满足这些缺点,但它仍然对开发人员有一定的困难,但它仍然存在一定的困难但这不会影响其在Java中的地位。

  https://juejin.cn/post/6993647089431347237

  https://github.com/esotericsoftware/kryo#References

  [代码]:https://github.com/alvinlkk/awesome-java-full-demo/master/kryo-demo

  原始:https://juejin.cn/post/7107064264786968612