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;
    }
}

实现类的实现方法:

@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

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在Spring Boot项目,如果需要将数据存储Redis缓存,可以使用RedisTemplate来实现。RedisTemplate是Spring提供的一个用于访问Redis的模板类,它可以方便地对Redis进行操作。 首先,需要在pom.xml添加Redis相关的依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 然后在application.properties配置Redis相关的参数: ``` spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= spring.redis.database=0 ``` 接下来,在Spring Boot的配置类注入RedisTemplate,并设置其序列化方式和连接工厂: ``` @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } } ``` 最后,在需要将数据存储Redis的地方,直接使用RedisTemplate即可: ``` @Autowired private RedisTemplate<String, Object> redisTemplate; public void saveToRedis(String key, Object value) { redisTemplate.opsForValue().set(key, value); } ``` 如果需要将数据存储到DB1,可以使用Spring Data JPA来实现。首先,需要在pom.xml添加Spring Data JPA相关的依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 然后,在application.properties配置DB1相关的参数: ``` spring.datasource.url=jdbc:mysql://localhost:3306/db1 spring.datasource.username=root spring.datasource.password=root ``` 接下来,创建一个JPA实体类,并使用@Entity注解标注,同时指定对应的数据表名: ``` @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Integer age; // 省略getter/setter方法 } ``` 然后,创建一个继承自JpaRepository的接口,用于操作User实体类对应的数据表: ``` public interface UserRepository extends JpaRepository<User, Long> { } ``` 最后,在需要将数据存储到DB1的地方,直接使用UserRepository即可: ``` @Autowired private UserRepository userRepository; public void saveToDB1(User user) { userRepository.save(user); } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值