zoukankan      html  css  js  c++  java
  • 序列化+protobuff+redis

    背景:

    当redis里面需要存储 “key-字符串,value-对象” 时,是不能直接存对象,而是需要将序列化后的对象存进redis。

    redis没有实现内部序列化对象的功能,所以需要自己提前序列化对象。

    序列化介绍:

    序列化的方法有很多,比如java原生序列化(需要实现Serializable接口)、json序列化、protobuff序列化。

    java原生序列化:https://www.cnblogs.com/yaobolove/p/5632891.html

    protobuff序列化:告诉我对象的class,内部有schema来描述你的class是什么结构,class必须有get/set方法这种标准的类,而不是string等类

    第一步:maven依赖  
    <!--prostuff序列化依赖--> <dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId>protostuff-core</artifactId> <version>1.0.8</version> </dependency> <dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId>protostuff-runtime</artifactId> <version>1.0.8</version> </dependency>

    第二步:
    定义全局的变量,注意Seckill是我自己定义的一个类,不需要实现接口
       private RuntimeSchema<Seckill> schema = RuntimeSchema.createFrom(Seckill.class);

    完整代码:
    public class RedisDao {
    private final JedisPool jedisPool;

    public RedisDao(String ip, int port) {
    jedisPool = new JedisPool(ip, port);
    }

    private RuntimeSchema<Seckill> schema = RuntimeSchema.createFrom(Seckill.class);


    public Seckill getSeckill(long seckillId) {
    //redis操作逻辑
    try {
    Jedis jedis = jedisPool.getResource();
    try {
    String key = "seckill:" + seckillId;
    //并没有实现哪部序列化操作
    //采用自定义序列化
    //protostuff: pojo.
    byte[] bytes = jedis.get(key.getBytes());
    //缓存重获取到
    if (bytes != null) {
    Seckill seckill=schema.newMessage();//这是一个空对象
    ProtostuffIOUtil.mergeFrom(bytes,seckill,schema);//按照schema把bytes传到空对象里
    //seckill被反序列化

    return seckill;
    }
    }finally {
    jedis.close();
    }
    }catch (Exception e) {

    }
    return null;
    }
       public String putSeckill(Seckill seckill) {
    try {
    Jedis jedis = jedisPool.getResource();
    try {
    String key = "seckill:" + seckill.getSeckillId();
    //LinkedBuffer.allocate是缓存器,当压缩的对象太大是,起到缓冲的作用,该方法是protobuff自带的。
    byte[] bytes = ProtostuffIOUtil.toByteArray(seckill, schema,
    LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
    //超时缓存
    int timeout = 60 * 60;//1小时
    String result = jedis.setex(key.getBytes(),timeout,bytes);

    return result;
    }finally {
    jedis.close();
    }
    }catch (Exception e) {

    }

    return null;
    }
    }

    java原生序列化:https://www.cnblogs.com/yaobolove/p/5632891.html

  • 相关阅读:
    jmeter压测-05-xpath表达式
    测试那些事-测试资源篇
    测试那些事-沟通篇
    测试那些事-前端
    测试那些事儿-后端
    记一次大数据量不同处理方式下服务器负载
    jmeter压测dubbo接口,参数为dto时如何写传参及有错误时的分析思路
    pyton3 字典排序
    python测试dubbo接口
    记录一下telnet测试dubbo接口,参数为dto时怎么测试,枚举类型传参
  • 原文地址:https://www.cnblogs.com/SuMeng/p/8900142.html
Copyright © 2011-2022 走看看