protostuff

java序列化/反序列化之xml、protobuf、protostuff 的比较与使用例子

若如初见. 提交于 2020-02-26 02:08:30
目录 1、背景 2、测试   2.1、环境   2.2、工具   2.3、说明   2.4、结果   2.5、结论 3、xml简单教程   3.1、准备   3.2、代码  4、protobuf简单教程   4.1、快速入门     1、下载.exe编译器     2、编写.proto文件     3、利用编译器编译.proto文件生成javabean     4、引用jar包     5、直接使用javabean自带的序列化、反序列化、提取属性等方法 5、protostuff简单教程   5.1、快速入门     1、引用jar包     2、直接使用相关序列化、反序列化语法 6、protobuf与protostuff区别 protostuff是一个基于protobuf实现的序列化方法,它较于protobuf最明显的好处是,在几乎不损耗性能的情况下做到了不用我们写.proto文件来实现序列化。 1、背景 我今天要将的是google开发的开源的序列化方案protocol buffer(简称protobuf),它的好处很多,独立于语言,独立于平台,最最重要的是它的效率相当高,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一。 2、测试 2.1 测试环境 xstraem版本:1.3.1 protobuf-java版本:3.0.0

Java系统高并发之Redis后端缓存优化

三世轮回 提交于 2020-02-05 07:26:18
一:前端优化 暴露接口,按钮防重复(点击一次按钮后就变成禁用,禁止重复提交) 采用CDN存储静态化的页面和一些静态资源(css,js等) 二:Redis后端缓存优化 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。 利用Redis可以减轻MySQL服务器的压力,减少了跟数据库服务器的通信次数。 2.1 Redis服务端下载以及安装 详细步骤参考: Redis服务端安装教程 注:以下pom.xml为Maven项目配置文件,若非Maven项目,百度相应名称包导入即可。 2.2 在pom.xml中配置Redis客户端 <!-- redis客户端:Jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.3</version> </dependency> 由于Jedis并没有实现内部序列化操作,而Java内置的序列化机制性能又不高

使用jedis连接redis-cluster进行字符串数据结构api演示

天大地大妈咪最大 提交于 2020-01-09 04:12:52
继上一篇创建测试基类之后,可以根据父类创建子类进行专门的测试,下面将针对基于jedis连接redis cluster集群的操作做一个系列文章。本章内容讲解redis 字符串数据结构的一些jedis操作。 package com.coderman.jedis.clusterdemo; import com.alibaba.fastjson.JSON; import com.coderman.jedis.dto.PersonDto; import com.coderman.jedis.serialize.ProtoStuffSerializerUtil; import org.junit.Test; import java.util.ArrayList; import java.util.List; /** * @Author fanchunshuai * @Date 2019/12/28 18 * @Description:Redis的String数据结构练习 * * 字符串类型的值实际可以 是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、 * 数字 (整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能 超过512MB。 * *字符串类型的内部编码有3种: * ·int:8个字节的长整型。 * ·embstr:小于等于39个字节的字符串。 * ·raw

Dynamic Schema & Deserialization with Protostuff

不打扰是莪最后的温柔 提交于 2019-12-13 02:01:44
问题 I'm using Protostuff in an attempt to serialize/deserialize objects of several different types for which no protobuf sources are available (it's a server-server RPC scenario). Serialization goes OK because I know the type of the object to serialize and can create the schema: Schema schema = RuntimeSchema.getSchema(object.getClass()); Now, I use ProtobufIOUtil.toByteArray and get a byte array which I then pass to a remote server. However, I can't seem to deserialize this byte array in the

Spring+Netty+Protostuff+ZooKeeper实现轻量级RPC服务

假装没事ソ 提交于 2019-12-06 00:53:51
RPC简介 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样。 RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC,它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC。会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化。 众所周知,TCP 是传输层协议,HTTP 是应用层协议,而传输层较应用层更加底层,在数据传输方面,越底层越快,因此,在一般情况下,TCP 一定比 HTTP 快。就序列化而言,Java 提供了默认的序列化方式,但在高并发的情况下,这种方式将会带来一些性能上的瓶颈,于是市面上出现了一系列优秀的序列化框架,比如:Protobuf、Kryo、Hessian、Jackson 等,它们可以取代 Java 默认的序列化,从而提供更高效的性能。 为了支持高并发,传统的阻塞式 IO 显然不太合适,因此我们需要异步的 IO,即 NIO。Java 提供了 NIO 的解决方案,Java 7 也提供了更优秀的 NIO.2 支持,用 Java 实现 NIO 并不是遥不可及的事情,只是需要我们熟悉 NIO 的技术细节。 我们需要将服务部署在分布式环境下的不同节点上,通过服务注册的方式,让客户端来自动发现当前可用的服务,并调用这些服务

关于Jackson默认丢失Bigdecimal精度问题分析

可紊 提交于 2019-12-05 10:51:15
问题描述 最近在使用一个内部的RPC框架时,发现如果使用Object类型,实际类型为BigDecimal的时候,作为传输对象的时候,会出现丢失精度的问题;比如在序列化前为金额1.00,反序列化之后为1.0,本身值可能没有影响,但是在有些强依赖金额的地方,会出现问题; 问题分析 查看源码发现RPC框架默认使用的序列化框架为Jackson,那简单,看一下本地是否可以重现问题; 1.准备数据传输bean public class Bean1 { private String p1; private BigDecimal p2; ...省略get/set... } public class Bean2 { private String p1; private Object p2; ...省略get/set... } 为了更好的看出问题,分别准备了2个bean; 2.准备测试类 public class JKTest { public static void main(String[] args) throws IOException { ObjectMapper mapper = new ObjectMapper(); Bean1 bean1 = new Bean1("haha1", new BigDecimal("1.00")); Bean2 bean2 = new Bean2(

新浪微博:大规模离线视频处理系统的架构设计

自古美人都是妖i 提交于 2019-12-05 04:37:17
微博视频平台在4亿月活用户吃瓜嗨聊的高并发、大流量背景下,既要保证用户微博生产和消费体验,又要支持业务快速迭代,确保正确性、稳定性和高可用性。本次演将以微博视频大规模视频离线处理系统的架构设计为主题为大家带来大规模分布式系统的架构设计,性能优化和高可用保障等一线实战经验。 文 / 霍东海 整理 / LiveVideoStack 大家好,我是来自新浪微博视频平台和微博平台研发部的架构师霍东海,从2017年加入微博,目前在微博视频平台负责微博视频离线处理系统架构等相关工作,包括大规模离线微服务系统的架构设计和服务保障体系的建设等。近期专注于视频平台技术体系的提升对用户体验提升的帮助,主导构建了微博SVE(Streaming Video Engine)系统,支持大并发场景下对视频进行并行转码,大幅度提升转码效率。 1. 背景介绍 微博本身有大并发、大流量的特性,有4亿+的月活,同时微博也是一个开放平台,支持多种第三方分享,每天都会有百万视频分享需进行处理。 微博视频业务大概分两种业余形态,一个如左图所示,是竖版的短视频分享,另一个是如右图所示的稍微长一点的横向播放的短视频。 微博视频还有一些特殊的场景,例如在微博PC端点视频按钮会跳转到酷燃网,它是一个5到15分钟的短小综艺类视频分享的网站,如图中,下面都是一些优酷,爱奇艺,腾讯等视频网站分享到微博的视频。

Protostuff 的Java序列化和反序列化

匿名 (未验证) 提交于 2019-12-02 21:53:52
序列化和反序列化是在应对网络编程最常遇到的问题之一。 序列化就是将Java Object转成byte[];反序列化就是将byte[]转成Java Object。 这里不介绍JDK serializable的序列化方式,而是介绍一个更高效的序列化库-protostuff。 Protostuff简介 Protostuff是一个序列化库,支持一下序列化格式: protobuf protostuff(本地) graph json smile xml yaml kvp 序列化和反序列化工具 序列化 @SuppressWarnings ( "unchecked" ) public static <T> byte [] serialize(T obj) { Class<T> cls = (Class<T>) obj.getClass(); LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE); try { Schema<T> schema = getSchema(cls); return ProtostuffIOUtil.toByteArray(obj, schema, buffer); } catch (Exception e) { throw new

新浪微博:大规模离线视频处理系统的架构设计

时光毁灭记忆、已成空白 提交于 2019-11-25 22:22:52
微博视频平台在4亿月活用户吃瓜嗨聊的高并发、大流量背景下,既要保证用户微博生产和消费体验,又要支持业务快速迭代,确保正确性、稳定性和高可用性。本次演将以微博视频大规模视频离线处理系统的架构设计为主题为大家带来大规模分布式系统的架构设计,性能优化和高可用保障等一线实战经验。 文 / 霍东海 整理 / LiveVideoStack 大家好,我是来自新浪微博视频平台和微博平台研发部的架构师霍东海,从2017年加入微博,目前在微博视频平台负责微博视频离线处理系统架构等相关工作,包括大规模离线微服务系统的架构设计和服务保障体系的建设等。近期专注于视频平台技术体系的提升对用户体验提升的帮助,主导构建了微博SVE(Streaming Video Engine)系统,支持大并发场景下对视频进行并行转码,大幅度提升转码效率。 1. 背景介绍 微博本身有大并发、大流量的特性,有4亿+的月活,同时微博也是一个开放平台,支持多种第三方分享,每天都会有百万视频分享需进行处理。 微博视频业务大概分两种业余形态,一个如左图所示,是竖版的短视频分享,另一个是如右图所示的稍微长一点的横向播放的短视频。 微博视频还有一些特殊的场景,例如在微博PC端点视频按钮会跳转到酷燃网,它是一个5到15分钟的短小综艺类视频分享的网站,如图中,下面都是一些优酷,爱奇艺,腾讯等视频网站分享到微博的视频。