`

hessian序列化协议+memcached的缓存存取

 
阅读更多

大名鼎鼎的memcached恐怕没人不知道吧!hessian是一种远程调用的机制 ,类似于web service,不过它是使用自己的序列化协议。 
  那么,为什么要把hessian的序列化协议和memcached结合起来实现缓存 的读取呢? 
  有过使用memcached的经验的人会了解到,php+memcached的性能 是最好的,java+memcached的性能比较差,其主要原因就是在于java本身的序列化机制很慢。 
  我做了个简单的测试 , 一个UserData类,有一个字符串属性,一个日期属性,一个double属性,分别用java,hessian来序列化一百万次,结果让人吃惊,不止 是hessian序列化的速度要比java的快上一倍,而且hessian序列化后的字节数也要比java的少一倍。因为我在测试的时候只是做了序列化这 部分的工作,并没有把序列化后的结果放到网络上传 输,所以,实际中的性能hessian应该会更好! 
  既然hessian的序列化协议要比java本身的好,而memcached客户端的性能又在很大程度上依赖与对象的序列化。所以,我就决定把我的cache实现中序列化这部分的工作改成用hessian来实现了。 
  我用的memcached客户端是用的danga。MemCached包,主要是改动了MemCachedClient的get方法及set方法,在set方法中改为调用hessian的序列化: 
  ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
  //修改以前的序列化代码: 
  //(new ObjectOutputStream( bos )).writeObject( value ); 
  //修改后的序列化代码: 




serializeByHessian(bos, value);
  val = bos.toByteArray();
  serializeByHessian方法如下:
  protected void serializeByHessian(OutputStream os, Object object) throws IOException {
  AbstractHessianOutput out = new Hessian2Output(os);;
  SerializerFactory serializerFactory = getSerializerFactory();
  out.setSerializerFactory(serializerFactory);
  out.startReply();
  out.writeObject(object);
  out.completeReply();
  out.flush();
  } 
  在get方法中主要是修改了这个方法调用的类ContextObjectInputStream的readObject方法: 
  在ContextObjectInputStream中覆盖了readObjectOverride方法: 




 protected Object readObjectOverride() throws IOException, ClassNotFoundException {
  ByteArrayInputStream is = new ByteArrayInputStream(bytes);
  ClHessian2Input in = new ClHessian2Input(is, this.mLoader);
  in.setSerializerFactory(getSerializerFactory());
  int code = in.read();//"r"
  int major = in.read();//%26gt;=2
  int minor = in.read();//0
  Object value = in.readObject();
  is.close();
  return value;
  } 
  因为我的框架 是 基于osgi的,所以我重载了Hessian2Input,把classloader作为参数传进去,否则hessian在反序列化的时候会找不到类。如 果你没有用osgi框架的话, ClHessian2Input in = new ClHessian2Input(is, this。mLoader);这行代码就可以直接用: Hessian2Input in = new Hessian2Input(is); 
  这样修改就基本完成了。 
  我把memcached client的序列化协议改为hessian也有另外一个系统架构 的 原因,那就是因为我的服务层逻辑都是用java+spring+osgi的方式实现,而web层则是用php实现,两者之间通讯已经是采用hessian 的远程调用。所以,部分缓存数据在服务层通过java设置到memcached服务器中,在php中一样可以用memcached php client读取出来。

分享到:
评论

相关推荐

    hessian学习基础篇——序列化和反序列化

    本文将深入探讨Hessian框架的基础知识,它是一个高效的二进制序列化协议,广泛应用于Java和.NET之间跨语言通信。通过学习Hessian,我们可以更有效地处理数据传输,提高应用性能。 首先,让我们理解什么是序列化。...

    hessian序列化规范

    Hessian,作为一种高效的二进制序列化协议,由Caucho公司开发,广泛应用于Java、.NET等平台,尤其在远程方法调用(RPC)中表现出色。本文将深入探讨Hessian序列化规范,旨在帮助开发者更好地理解和应用这一技术。 ...

    Hessian 的字段序列化小记

    Hessian是一种二进制的序列化协议,由Caucho公司开发,它旨在提供高效、轻量级的数据交换方式。本文将围绕"Hessian的字段序列化小记"这一主题,深入探讨Hessian的工作原理、序列化过程以及其在实际应用中的价值。 ...

    S25-hessian反序列化1

    Hessian是一种二进制序列化协议,旨在提高远程过程调用(RPC)的效率。与原生Java序列化相比,Hessian序列化具有更快的速度和更小的数据传输量。 在Java中,通常只有实现了`java.io.Serializable`接口的类才能被序列...

    Hessian 2.0序列化协议规范.docx

    《Hessian 2.0序列化协议规范》 在分布式计算和网络通信中,数据的序列化和反序列化是至关重要的环节。Hessian 2.0是一种高效的二进制序列化协议,它旨在减少网络传输的数据量,提高数据交换的效率。本文将详细介绍...

    浅谈Java序列化和hessian序列化的差异

    Java序列化和Hessian序列化的差异 Java序列化和Hessian序列化是两种常用的序列化机制,它们都可以将对象转换为字节流,以便在网络上传输。但是,两者之间有着很大的差异,今天我们就来比较一下它们的实现机制和特点...

    dubbo-hessian协议http请求demo(java)

    Hessian是一种高效的序列化协议,它将Java对象转换为二进制流,通过网络传输,然后在另一端还原为原来的对象。相比基于文本的XML或JSON,Hessian传输的数据量更小,性能更高。 在Dubbo中,Hessian协议被用于服务间...

    spingMVC+mybatis+hessian+activeMQ+redis

    完美整合spingMVC+mybatis+hessian+activeMQ+redis,引入mybatis物理分页插件,模拟cookie登陆的工具类。

    34_dubbo都支持哪些通信协议以及序列化协议?.zip

    2. **Hessian2**:一种快速的二进制序列化协议,它将Java对象转换为高效的字节流,适合于内部系统间通信。 3. **Fastjson**:阿里巴巴开源的JSON库,它也可以用于序列化和反序列化Java对象,性能较好,且支持复杂的...

    Dubbo 序列化协议 5 连问,你接得住不.PDF

    默认就是⾛ dubbo 协议,单⼀⻓连接,进⾏的是 NIO 异步通信,基于 hessian 作为序列化协议。使⽤的场景是:传输数据量⼩ (每次请求在 100kb 以内),但是并发量很⾼。 为了要⽀持⾼并发场景,⼀般是服务提供者就⼏...

    Nacos JRaft Hessian 反序列化 RCE 分析.pdf

    ### Nacos JRaft Hessian 反序列化 RCE 分析 #### 一、背景介绍 Nacos 是阿里巴巴开源的一款易于构建云原生应用的动态服务发现、配置管理和服务管理平台。JRafT 是 SOFAStack 微服务平台中的一个分布式一致性组件...

    hessian-4.0.7.jar + src

    在软件开发领域,Hessian是一种高效的二进制序列化协议,它由Caucho Technology公司开发,常用于实现远程方法调用(RMI)和Web服务。本次我们将深入探讨Hessian 4.0.7版本,包括其jar包的使用以及源码分析,帮助...

    Netty之序列化协议

    在IT行业中,网络通信是关键的一环,而高效、安全的数据传输往往依赖于优秀的序列化协议。Netty作为一款高性能的异步事件驱动的网络应用框架,为Java开发者提供了强大的网络编程工具。在这个主题中,我们将深入探讨...

    hessian java +c# 数据测试

    在Java端定义的类可以通过Hessian的`Hessian2Output`进行序列化,C#端的类则需要通过HessianNet的解码器来反序列化。 至于"List"和"Map",它们在Hessian中也有特别的处理方式。Hessian可以序列化和反序列化List和...

    Dubbo序列化协议5连问,你接得住不?.docx

    在Dubbo中,序列化协议是实现RPC通信的关键部分,因为它涉及到数据的转换和网络传输。 1. **Dubbo支持的通信协议**: - **Dubbo协议**:默认协议,采用单个长连接和NIO异步通信,基于Hessian进行序列化。适用于大...

    SpringMVC + Mybatis + Hessian + Maven

    Spring + Mybatis + Hessian 亲自手写,附带测试用例,有问题随时提问。操作流程,自己导入sql,并修改数据库配置,配置Tomcat后启动服务,然后启动Tomcat, 最后测试用例。 测试用例步骤:步骤1.Run HessianTest. ...

    removal RCE、Hessian 反序列化、Yaml反序列化、密码解密、部分常用敏感路径(漏洞更新截止2024.9.12)

    removal RCE、Hessian 反序列化、Yaml反序列化、密码解密、部分常用敏感路径(漏洞更新截止2024.9.12)

    Hessian协议格式

    Hessian 协议格式 Hessian 协议是一种轻量级的 remoting on http 工具,使用简单的方法提供了 RMI 的功能。采用的是二进制 RPC 协议,所以它很适合于发送二进制数据。Hessian 主要用作面向对象的消息通信。 ...

    Hessian-4.0.7(Jar包 + 源码)

    通过阅读源码,开发者可以了解Hessian如何实现高效的序列化和反序列化,以及它是如何处理网络通信的。源码也使得开发者能够根据需要修改或扩展Hessian的功能,例如添加新的序列化策略,或者优化特定场景下的性能。 ...

Global site tag (gtag.js) - Google Analytics