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;
}
}
实现类的实现方法:
@Resource //这里的注入方式写成@Autowired的话会报错,所以要写成@Resource的注入方式
private RedisTemplate<String, Object> redisTemplate;
@Override
public int AddSongCache(){
redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(SongRedis.class));
// this.redisTemplate = redisTemplate;
HashOperations<String,String,String> maphash = redisTemplate.opsForHash();
List<SongRedis> list = new ArrayList<>();
SongRedis songRedis = new SongRedis();
songRedis.setAuthor("作者0011");
songRedis.setId("1111");
songRedis.setPath("ytrytry");
songRedis.setSongname("歌曲00011");
list.add(songRedis);
songRedis.setAuthor("作者00022");
songRedis.setId("2222");
songRedis.setPath("ooooo");
songRedis.setSongname("歌曲0002");
list.add(songRedis);
try{
for(SongRedis s : list){
//序列化对象操作
ObjectOutputStream obi = null;
ByteArrayOutputStream bao = null;
bao = new ByteArrayOutputStream();
obi = new ObjectOutputStream(bao);
obi.writeObject(s);
byte[] by = bao.toByteArray();
//保存序列化后的对象到redis缓存中
redisTemplate.boundHashOps("song").put(s.getAuthor(),s);
}
//设置过期时间2000秒
redisTemplate.expire("song",2000, TimeUnit.SECONDS);
}catch(Exception e){
System.out.println("出错啦!!!!");
}
return 0;
}
两步完成Redis存储对象的操作,至于Redis配置的方案,这里就不给出来了,网上基本都有。这篇博客不是redis教程,有时间的可能会具体把我学习redis的过程整理成教程,但不是现在。
想更详细了解的,可以到这篇博文去看看:https://blog.csdn.net/xzd315752647/article/details/86409815