springboot中如何使用RedisTemplate存储实体对象
RedisTemplate是spring封装的操作redis的接口,使用起来很方便,但也有很多坑,比如存储javabean类。
网上找了很多资料,很多都语焉不详,几乎毫无作用。
redis存储对象需要对实体类进行序列化,也就是写成javabean,而不是pojo类。
其次,在存储对象的操作中,需要对实体类进行流化读写操作,就像文件的字节流的序列化操作一样,因为序列化本身就是流的转化的过程。而数据的持久化实际上也就是把数据写入磁盘文件的操作。大家把持久化和文件的读写操作联系起来就容易理解了。
但是,很多资料都没有提到具体对象的流化操作,所以按照那些资料操作往往会报错。大家需要注意这一点。
查了一些资料,RedisTemplate存储对象需要用到两个类:ObjectOutputStream和ByteArrayOutputStream。
“ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。”
“ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据。在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。”
这两个类大概就是上面两段所说的这么一回事。
我们采用HashMap的数据结构来存储,但像网上直接使用redisTemplate.boundHashOps(String).put(String,Object);是不行的。
至于那些重写序列化的方式,我一时也没看明白,感觉太麻烦,这里就给大家演示最简单的方式好了:
实体类:
/*务必记得继承序列化的接口*/
public class SongRedis implements Serializable{
private final static long serialVersionUID = 1L;
private String id;
private String songname;
private String author;
private String path;
private final String OBJECT_KEY = "SONGS";
public String getSongname() {
return songname;
}
public void setSongname(String songname) {
this.songname = songname;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getKey() {
return getId();
}
public String getObjectKey() {
return OBJECT_KEY;
}
}
实现类的实现方法:
两步完成Redis存储对象的操作,至于Redis配置的方案,这里就不给出来了,网上基本都有。这篇博客不是redis教程,有时间的可能会具体把我学习redis的过程整理成教程,但不是现在。
想更详细了解的,可以到这篇博文去看看:
