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