/**
* User: laizhenwei
* Date: 2018-04-10 Time: 14:17
* Description:
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class MessageProtoTest { //ProtoBuf
@Resource
private RedisTemplate<String,MessageProto.Message> messageProtoRedisTemplate; //JDK
@Resource
private RedisTemplate<String,MessageProto.Message> redisTemplate; //String json
@Resource
private RedisTemplate<String,String> jsonRedisTemplate; //JDK
@Test
public void add(){
BoundSetOperations<String, MessageProto.Message> operations = redisTemplate.boundSetOps("message1");
long begin = System.nanoTime();
for(int i = 0;i<100 ;i++){
MessageProto.Message.Builder builder = MessageProto.Message.newBuilder();
builder.setId(i);
builder.setLength(10);
builder.setMsgBody("你好啊");
builder.setType(MessageProto.Message.Type.ACTIVE_VALUE);
MessageProto.Message message = builder.build();
operations.add(message);
} System.out.println((System.nanoTime() - begin)/1000000); } //ProtoBuf
@Test
public void add2(){
BoundSetOperations<String, MessageProto.Message> operations = messageProtoRedisTemplate.boundSetOps("message2");
long begin = System.nanoTime();
for(int i = 0;i<100 ;i++){
MessageProto.Message.Builder builder = MessageProto.Message.newBuilder();
builder.setId(i);
builder.setLength(10);
builder.setMsgBody("你好啊");
builder.setType(MessageProto.Message.Type.ACTIVE_VALUE);
MessageProto.Message message = builder.build();
operations.add(message);
} System.out.println((System.nanoTime() - begin)/1000000);
} //String json
@Test
public void add3(){ Gson gson = new Gson();
BoundSetOperations<String, String> operations = jsonRedisTemplate.boundSetOps("message3"); long begin = System.nanoTime(); for(int i = 0;i<100 ;i++){
MessageProto.Message.Builder builder = MessageProto.Message.newBuilder();
builder.setId(i);
builder.setLength(10);
builder.setMsgBody("你好啊");
builder.setType(MessageProto.Message.Type.ACTIVE_VALUE);
MessageProto.Message message = builder.build();
operations.add(gson.toJson(message));
} System.out.println((System.nanoTime() - begin)/1000000); }
}

耗时:

jdk: 192毫秒

protoBuf: 93 毫秒

Json: 107 毫秒

单行数据大小

JDK: 

protoBuf: 

JSON:

JDK使用ProtoBuf 生成的 java 文件类生产,看起来有很多垃圾数据

这次用 普通JAVA 类,写一个差不多结构的再试一次

    @Getter
@Setter
public static class Message implements Serializable { private static final long serialVersionUID = -7270500345236168152L; //消息类型
private Byte type; //消息长度
private Integer length; private Long id; //消息体
private String msgBody; public Message(Byte type, Integer length, Long id, String msgBody) {
this.type = type;
this.length = length;
this.id = id;
this.msgBody = msgBody;
} @Getter
public enum Type {
ACTIVE((byte) 0x00, "激活"), MESSAGE((byte) 0x01, "消息"); //状态代码
private Byte code;
//状态名称
private String name; //构造方法
Type(Byte code, String name) {
this.code = code;
this.name = name;
} //根据code获取状态名称
public static String getNameByCode(Byte code) {
for (Type item : Type.values())
if (item.getCode().equals(code))
return item.getName();
return "";
}
} }
    //JDK
@Test
public void add() {
BoundSetOperations<String, MessageProtoTest.Message> operations = redisTemplate.boundSetOps("message4");
long begin = System.nanoTime();
for (int i = 0; i < 100; i++)
operations.add(new MessageProtoTest.Message(Message.Type.ACTIVE.getCode(),10,(long)i,"你好啊")); System.out.println((System.nanoTime() - begin) / 1000000); }

结果: 耗时  137毫秒

单行数据大小: 

看起来更糟糕

Message.proto

syntax = "proto3";
option java_package = "com.lzw.protobuf";
option java_outer_classname = "MessageProto";
message Message { int32 type = 1; int32 length = 2; int32 id = 3; string msgBody = 4; enum Type {
ACTIVE = 0;
MESSAGE = 1;
} }

Redis JdkSerializationRedisSerializer,stringRedisSerializer,ProtoBuf 体积,性能简单比较.的更多相关文章

  1. Redis缓存的设计、性能、应用与数据集群同步

    Redis缓存的设计.性能.应用与数据集群同步 http://youzhixueyuan.com/design-performance-and-application-of-redis-cache.h ...

  2. [评测]低配环境下,PostgresQL和Mysql读写性能简单对比(欢迎大家提出Mysql优化意见)

    [评测]低配环境下,PostgresQL和Mysql读写性能简单对比 原文链接:https://www.cnblogs.com/blog5277/p/10658426.html 原文作者:博客园--曲 ...

  3. 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制

    [原创]分布式之数据库和缓存双写一致性方案解析(三)   正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...

  4. Redis配置文件各项参数说明及性能调优

    Redis配置文件参数说明: 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以守护进程方式运行时,Redis默 ...

  5. Redis源码解析:01简单动态字符串SDS

    Redis没有直接使用C字符串(以'\0'结尾的字符数组),而是构建了一种名为简单动态字符串( simple  dynamic  string, SDS)的抽象类型,并将SDS用作Redis的默认字符 ...

  6. python+uwsgi导致redis无法长链接引起性能下降问题记录

    今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因 ...

  7. WCF 中 TCP 与 HTTP 性能简单比较

    在使用 WCF 时,为了更好地进行调试,我都选择了 HTTP 协议进行数据传输.最近项目对性能要求比较高,所以就换成了使用 TCP 协议.并对二者的性能进行了一个简单的测试.以下是测试结果: 环境: ...

  8. 关于redis的keys命令的性能问题

    KEYS pattern 查找所有符合给定模式 pattern 的 key . KEYS * 匹配数据库中所有 key . KEYS h?llo 匹配 hello , hallo 和 hxllo 等. ...

  9. 【jQuery基础学习】11 jQuery性能简单优化

    关于性能优化 合适的选择器 $("#id")会直接调用底层方法,所以这是最快的.如果这样不能直接找到,也可以用find方法继续查找 $("p")标签选择器也是直 ...

随机推荐

  1. selenium+python自动化80-文件下载(不弹询问框)

    前言 上一篇是点弹出框上的按钮去保存文件,本篇介绍一种更加优雅的方法,加载Firefox和Chrome的配置文件,不弹出询问框后台下载. 一.FirefoxProfile 1.点下载的时候,如下图,如 ...

  2. js 获取浏览器/网页宽度高度整理

    网页宽度.高度: 网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.bo ...

  3. Java8 利用Lambda处理List集合循环给另外一个List赋值过滤处理

    1.利用stream().forEach()循环处理List; List<String> list = Lists.newArrayList();//新建一个List 用的google提供 ...

  4. Art: Neural Style Transfer

    Andrew Ng deeplearning courese-4:Convolutional Neural Network Convolutional Neural Networks: Step by ...

  5. Spark:java api读取hdfs目录下多个文件

    需求: 由于一个大文件,在spark中加载性能比较差.于是把一个大文件拆分为多个小文件后上传到hdfs,然而在spark2.2下如何加载某个目录下多个文件呢? public class SparkJo ...

  6. Adobe Photoshop for Mac(图像处理软件)破解版安装

    1.软件简介    Adobe Photoshop(简称 "PS")是 macOS 系统上一款由 Adobe Systems 开发和发行的图像处理软件.Photoshop 主要处理 ...

  7. rdlc报表在vs2008下编辑正常,在vs2012上编辑就报错

    最近我们的系统的开发工具由vs2008升级到了2012,由于系统中很多报表都是用rdlc来开发的,今天 遇到有报表需要改动的需求,就直接使用vs2012对rdlc报表进行了编辑,结果改完后,怎么预览报 ...

  8. ASP.NET CORE下用盛派微信SDK取微信openid

    用CORE做项目用到微信的相关东西,听说那个盛派微信SDK很火,自己弄了下,只是简单的用用,用户访问页面取微信openid

  9. Android studio的主题颜色修改

    1.选择喜欢的主题 http://color-themes.com/?view=index 好几十款,总有一款你喜欢 2.下载你喜欢的主题,注意是jar文件 .File -> Import Se ...

  10. Selenium Web 自动化 - 项目实战(二)

    Selenium Web 自动化 - 项目实战(二) 2016-08-08 什么是数据驱动?简答的理解就是测试数据决定了测试结果,这就是所谓数据驱动.数据驱动包含了数据,他就是测试数据,在自动化领域里 ...