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的过程整理成教程,但不是现在。
想更详细了解的,可以到这篇博文去看看: