方式一和方式二两种不同的存取方式
方式一:使用Json,将对象转化为Json字符串,然后存到数据库中,再通过Json将字符串转换为我们需要的对象即可!!
方式二:Jedis可以存储byte[ ]类型的数组,我们可以将对象转化为二进制数组存入Redis数据库中,然后需要的时候再将二进制数组转化为User对象即可
学习引导:
在学习了Jedis后,我们知道Jedis可以操作Redis数据库中的5种类型 分别是(String,List,Set,ScoreSet,Hash)
那么怎样往Redis数据库中存储javaBean对象呢?
思路一:我们知道使用Jedis操作数据库只能存String类型的键和Byte【】类型的数组
所以我们是不是可以使用toString的方法来存取,但是存取出来怎样转换为对象呢?
学习Ajax后,我们知道还有一种东西可以随意的切换字符串和对象 json!json!!!json!!!!!
方式一:使用Json,将对象转化为Json字符串,然后存到数据库中,再通过Json将字符串转换为我们需要的对象即可!!
我们开始操作
①:需要一个pojo类。我们创建一个实体类:
package com.bjsxt.pojo;
import java.io.Serializable;
/**
* 用户实体类
* */
public class User implements Serializable{
private String name;
private String sex;
private Integer age;
public User() {
}
public User(String name, String sex, Integer age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
②添加依赖,我们需要阿里的fastJson以及Jedis依赖还有测试Junit依赖:(在Pom文件中添加依赖)
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bjsxt.jedis.object</groupId>
<artifactId>jedis-object</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
</dependencies>
</project>
③通过json将对象转化为Json类型的字符串存储进去,然后再取出Json字符串,最后转化为对象即可:
/***
* 将对象转化为json字符串进行存储
* 取出是再将json字符串转化为对象即可
*/
@Test
public void jedisObjectTest() {
User user=new User("lht","男",22);
Jedis jedis=new Jedis("192.168.224.11",6379);
//将user对象转化为json对象
String userJson = JSON.toJSONString(user);
jedis.set("user", userJson);
//取值 此时为Json类型的字符串
String userString = jedis.get("user");
//将json字符串转化为User对象
User user2 = JSON.parseObject(userString, User.class);
System.out.println(user2);
}
方式二:Jedis可以存储byte[ ]类型的数组,我们可以将对象转化为二进制数组存入Redis数据库中,然后需要的时候再将二进制数组转化为User对象即可
序列化的概念:对象转化为二进制数组
反序列化:二进制数组转化为对象。
所以在使用这种方法的前提是,该类必须实现序列化接口。
package com.bjsxt.pojo;
import java.io.Serializable;
/**
* 用户实体类
* */
public class User implements Serializable{
private String name;
private String sex;
private Integer age;
public User() {
}
public User(String name, String sex, Integer age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
步骤二:添加工具类实现 方法一:对象转化为二进制数组,方法二:将二进制数组转化为对象!
package com.bjsxt.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectOrBinaryUtil {
/**
* 将对象转化为二进制数组的方法
* */
public static byte[] objectToBinary(Object o) {
try {
//创建一个字节输出流
ByteArrayOutputStream out = new ByteArrayOutputStream();
//创建一个对象输出流用于序列化为二进制数
//
//ObjectOutputStream只有一个public权限的构造方法:
//该构造方法需要传入一个OutputStream表示将对象二进制流写入到指定的OutputStream。
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(o);
//该方法从这个输出流返回字节数组
byte[] byteArray = out.toByteArray();
oos.close();
out.close();
return byteArray;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将二进制数组转化为我们需要的对象
* byte是传入的二进制数组,class是需要转换后的对象
* */
public static <T>T binaryToObject(byte[]bty,Class<T>clazz){
try {
ByteArrayInputStream bi = new ByteArrayInputStream(bty);
ObjectInputStream os = new ObjectInputStream(bi);
//转化为传入的对象类型
T o = (T) os.readObject();
os.close();
bi.close();
return o;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
步骤三:实现对象转化为二进制数组进行数组的存储,在将读取的二进制数组转化为对象
/**
* 因为我们存取的不仅仅是String类型的数据
* 所以我们可以把对象通过序列化转化为二进制数据存储进Redis数据库
* 再通过反序列化取出对象
* 前提:对象必须要实现Serializable接口
* */
@Test
public void jedisObject2Test() {
User user=new User("lht","男",22);
Jedis jedis=new Jedis("192.168.224.11",6379);
byte[] key = ObjectOrBinaryUtil.objectToBinary("user");
// byte[] value = ObjectOrBinaryUtil.objectToBinary(user);
// jedis.set(key, value);
byte[] bs = jedis.get(key);
User user1 = ObjectOrBinaryUtil.binaryToObject(bs, User.class);
System.out.println("1:"+user1);
}