大名鼎鼎的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读取出来。
- 浏览: 68294 次
- 性别:
- 来自: 北京
相关推荐
NULL 博文链接:https://qinghua0208.iteye.com/blog/493516
Hessian 2.0序列化协议规范
hessian序列化.pdf
介绍自己不会查吗?这里有一个点就是Hessian的序列化与反序列化与原生序列化与反序列化不同,就以使用的Resin链而言,其中的javax.naming.spi
NULL 博文链接:https://inter12.iteye.com/blog/1555678
主要通过对二者简单的实现方式的对比,介绍了Java序列化和hessian序列化的差异,具有一定参考价值,需要的朋友可以了解下。
NULL 博文链接:https://san-yun.iteye.com/blog/1688510
完美整合spingMVC+mybatis+hessian+activeMQ+redis,引入mybatis物理分页插件,模拟cookie登陆的工具类。
默认就是⾛ dubbo 协议,单⼀⻓连接,进⾏的是 NIO 异步通信,基于 hessian 作为序列化协议。使⽤的场景是:传输数据量⼩ (每次请求在 100kb 以内),但是并发量很⾼。 为了要⽀持⾼并发场景,⼀般是服务提供者就⼏...
Spring + Mybatis + Hessian 亲自手写,附带测试用例,有问题随时提问。操作流程,自己导入sql,并修改数据库配置,配置Tomcat后启动服务,然后启动Tomcat, 最后测试用例。 测试用例步骤:步骤1.Run HessianTest. ...
Nacos JRaft Hessian 反序列化 RCE 分析.pdf
dubbo-hessian协议http请求demo
Nepxion Thunder是一款基于Netty + Hessian + Kafka + ActiveMQ + Tibco + Zookeeper(Curator Framework) + Redis + FST + Spring + Spring Web MVC + Spring Boot + Docker分布式RPC调用框架。架构思想主要是来自...
hessian轻量级 rpc实现
SOFA-Hessian 基于原生Hessian v4.0.51进行改进,目前已经蚂蚁金服内部稳定运行多年。我们修复了一些bug,增强了一些功能,并且添加了一些特性。包括:增加泛化序列化。增加 ClassNameResolver 和 ClassNameFilter ...
Hessian协议报文格式总结,详细解释了hesssian请求报文格式和应答报文格式,并举例说明应答报文每个字节的含义。
Hessian协议是http://caucho.com/公司开发的一种实用的web服务技术,它采用二进制数据,传输效率比较高,简单易用,是C#.NET/IIS环境快速开发web服务应用的一种解决方案。本资源中包含Hessian协议的C#版源代码,由于...
java hessian-3.0.38.jar。修改了原生的jar包,解决了hessian 序列化BigDecimal的精度问题。注意,请在hessian服务端和客户端中分别替换此jar包哦!! 只替换服务端hessian jar包还是会有问题。
Hessian 2.0序列化协议规范 翻译: Edison peng 目录 1.概述 4 2.设计
a --args gadget入参,多个参数使用多次该命令传入,例-a -a Calc-p --protocol [dubbo|http] 通讯协议名称,默认缺省dubbo-s --serialization [hessian|java] 序列化类型,默认缺省hessian-t --target 目标,例:...