背景:

当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.</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>1.0.</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

最新文章

  1. 基础知识(05) -- Java中的类
  2. 模仿36。杀毒~button
  3. JAVA算法
  4. fullPage 全屏滚动【上下滚动】效果
  5. 通过PID获取进程路径的几种方法
  6. JQuery Object vs. DOM element
  7. Leetcode 7 Reverse Integer 数论
  8. MFC一个类访问另一个类成员对象的成员变量值
  9. DropDownList中显示无限级树形结构
  10. skip-character-set-client-handshake 与 character-set-client-handshake
  11. 如何将github上的微信客户端类库能够通过composer工具下载
  12. Android笔记(二):从savedIndstanceState发散
  13. GSS2-Can you answer these queries II
  14. schema文件中cube的事实表使用视图方法
  15. 关于数据汇总方面返回Json数据的小小心得
  16. 自述创业史 | XMove动作感应系统(二)
  17. Java-IO流之File操作和Properties操作
  18. 论文阅读(XiangBai——【CVPR2017】Detecting Oriented Text in Natural Images by Linking Segments)
  19. android 开发设计模式---观察者模式
  20. 走进科学之揭开神秘的&quot;零拷贝&quot;

热门文章

  1. spring boot中 使用http请求
  2. doxygen可以生成C/C++代码的文档(根据注释)
  3. jQuery导入代码片段并绑定事件
  4. PHP基础之Autoload
  5. java 通过Apache poi导出excel代码demo实例
  6. JavaScript 代码块
  7. Spring入门之AOP篇
  8. il code swtich
  9. 1、aritcMS-环境搭建-设置布局-布局测试
  10. Android之使用Android-query框架进行开发