title: Redis保存对象的两种方式
date: 2019-11-09 12:39:05
updated: 2019-11-09 12:39:05
categories:
- 搬砖笔记
- redis
tags:
- redis
Redis保存对象的两种方式
一、序列化(实体需要实现Serializable接口)
- 序列化就是将一个对象转换为二进制的数据流。这样就可以进行传输,或者保存到文件中。如果一个类的对象要想实现序列化,就必须实现serializable接口。 在此接口中没有任何的方法,此接口只是作为一个标识,表示本类的对象具备了序列化的能力而已。
- 反序列化:将二进制数据流转换成相应的对象
主要代码如下:
//保存对象(list一样)
Company company1 = new Company();
company1.setCustId(102034L);
company1.setCustName(getSessionUser().getCustName());
String string = jedisClient.set("test123".getBytes(),SerializationUtil.serialize((company1));
//获取对象
byte[] bs = jedisClient.get("test123".getBytes());
Company company =(Company)SerializationUtil.deserialize(bs);
序列化工具类(两个)代码如下:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializationUtil {
/**
* 序列化
*
* @param object
* @return
*/
public static byte[] serialize(Object object) {
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
byte[] bytes = baos.toByteArray();
return bytes;
} catch (Exception e) {
}
return null;
}
/**
* 反序列化
*
* @param bytes
* @return
*/
public static Object deserialize(byte[] bytes) {
ByteArrayInputStream bais = null;
try {
bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (Exception e) {
}
return null;
}
}
//这个也是可以的 捕获了一些异常
public class ObjectTranscoder {
public static byte[] serialize(Object value) {
if (value == null) {
throw new NullPointerException("Can't serialize null");
}
byte[] rv=null;
ByteArrayOutputStream bos = null;
ObjectOutputStream os = null;
try {
bos = new ByteArrayOutputStream();
os = new ObjectOutputStream(bos);
os.writeObject(value);
os.close();
bos.close();
rv = bos.toByteArray();
} catch (IOException e) {
throw new IllegalArgumentException("Non-serializable object", e);
} finally {
try {
if(os!=null)os.close();
if(bos!=null)bos.close();
}catch (Exception e2) {
e2.printStackTrace();
}
}
return rv;
}
public static Object deserialize(byte[] in) {
Object rv=null;
ByteArrayInputStream bis = null;
ObjectInputStream is = null;
try {
if(in != null) {
bis=new ByteArrayInputStream(in);
is=new ObjectInputStream(bis);
rv=is.readObject();
is.close();
bis.close();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(is!=null)is.close();
if(bis!=null)bis.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return rv;
}
}
二、json字符串
//保存对象(list一样)
Company company1 = new Company();
company1.setCustId(102034L);
company1.setCustName(getSessionUser().getCustName());
String string = jedisClient.set("test123", com.alibaba.fastjson.JSON.toJSONString(company1));
//获取对象
String returnValue = jedisClient.get("test123");
Company company = com.alibaba.fastjson.JSON.parseObject(returnValue,Company.class);
System.out.println(company.getCustName());
用redis的字符串存储java对象的话,后面查询的数据是没法进行分页的,如果要分页可以考虑用redis的list存储