背景:

当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等类

  1. 第一步:maven依赖
    <!--prostuff序列化依赖-->
  2. <dependency>
  3. <groupId>com.dyuproject.protostuff</groupId>
  4. <artifactId>protostuff-core</artifactId>
  5. <version>1.0.</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.dyuproject.protostuff</groupId>
  9. <artifactId>protostuff-runtime</artifactId>
  10. <version>1.0.</version>
  11. </dependency>
  12.  
  13. 第二步:
    定义全局的变量,注意Seckill是我自己定义的一个类,不需要实现接口
  1. private RuntimeSchema<Seckill> schema = RuntimeSchema.createFrom(Seckill.class);
  2.  
  3. 完整代码:
  1. public class RedisDao {
    private final JedisPool jedisPool;
  2.  
  3. public RedisDao(String ip, int port) {
    jedisPool = new JedisPool(ip, port);
    }
  4.  
  5. private RuntimeSchema<Seckill> schema = RuntimeSchema.createFrom(Seckill.class);
  6.  
  7. 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被反序列化
  8.  
  9. return seckill;
    }
    }finally {
    jedis.close();
    }
    }catch (Exception e) {
  10.  
  11. }
    return null;
    }
  1. 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);
  2.  
  3. return result;
    }finally {
    jedis.close();
    }
    }catch (Exception e) {
  4.  
  5. }
  6.  
  7. return null;
    }
    }

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

序列化+protobuff+redis的更多相关文章

  1. SpringBoot Redis使用fastjson进行序列化

    在使用spring-data-redis,默认情况下是使用org.springframework.data.redis.serializer.JdkSerializationRedisSerializ ...

  2. springboot 用redis缓存整合spring cache注解,使用Json序列化和反序列化。

    springboot下用cache注解整合redis并使用json序列化反序列化. cache注解整合redis 最近发现spring的注解用起来真的是很方便.随即产生了能不能吧spring注解使用r ...

  3. RESTful登录设计(基于Spring及Redis的Token鉴权)

    转载自:http://www.scienjus.com/restful-token-authorization/ http://m.blog.csdn.net/article/details?id=4 ...

  4. Redis(2)用jedis实现在java中使用redis

    昨天已经在windows环境下安装使用了redis. 下面准备在java项目中测试使用redis. redis官网推荐使用jedis来访问redis.所以首先准备了jedis的jar包,以及需要依赖的 ...

  5. Spring Boot 整合 Redis 实现缓存操作

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢!   『 产品没有价值,开发团队再优秀也无济于事 – <启示录> 』   本文提纲 ...

  6. Redis 数据结构与内存管理策略(上)

    Redis 数据结构与内存管理策略(上) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...

  7. Redis的安装及学习

    最近因为做Chatbot项目需要对于NoSQL数据库进行研究,调研范围包括MongoDB和Redis.本文将介绍Redis在Windows环境的安装及如何利用python来操作Redis数据库. Re ...

  8. SpringBoot使用Redis缓存

    (1).添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  9. Redis的key和value大小限制

    Redis的key和value大小限制        今天研究了下将java bean序列化到redis中存储起来,突然脑袋灵光一闪,对象大小会不会超过redis限制?不管怎么着,还是搞清楚一下比较好 ...

随机推荐

  1. cmake工程使用distcc

    distcc可以加速编译,但是遇到cmake可能就需要处理下. 问题 distcc在 /usr/lib/distcc 中放了各编译器的soft link(如cc/gcc等等),如果 /usr/lib/ ...

  2. Linux 脚本点滴知识积累

    1.以openwrt中的/etc/hotplug.d/button/00-button为例 . /lib/functions.sh do_button () { local button   ---- ...

  3. php方法重写:Declaration of should be compatible with that

    <?php// this code does trigger a strict messageerror_reporting( E_ALL | E_STRICT ); class cc exte ...

  4. FineReport实现java报表多级上报的效果图

    Java报表-上报流程管理 Java报表-上报任务管理 Java报表-我的上报任务 Java报表-系统说明

  5. nagios 安装

    #!/bin/sh ################################################ #this scripts is created by oldboy #site: ...

  6. ES6 学习笔记 (1)

    笔记来源:廖雪峰老师的javascript全栈教程 ES6:JavaScript的标准,ECMAScript在不断发展,最新版ECMAScript 6标准(简称ES6)已经在2015年6月正式发布了, ...

  7. Spell checker - poj 1035 (hash)

      Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22541   Accepted: 8220 Description Yo ...

  8. Marple表演电影字幕

    119501:15:59,702 --> 01:16:02,782我的幸运死了 而我很清楚是谁杀了她的 (格雷格)My Lucky is dead, and I know perfectly w ...

  9. Python抓取网页并保存为PDF

    https://blog.csdn.net/shenwanjiang111/article/details/67634794

  10. SteinerTree模板

    #define N 55//所有点的个数 #define K 10//SteinerTree 最大顶点数,必须精确 #define INF 10000000 //SteinerTree 邻接矩阵模板. ...