SpringBoot学习之路---整合redis以及修改RedisTemplate的默认序列化器

在现实开发中,我们往往会用到缓存,而缓存的话就会用到一些第三方的组件,SpringBoot也为我们提供了这些自动配置类,会帮助我们自动注入相关组件,我们只需要引入相关的starter即可


引入pom.xml的依赖:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

之后要指定redis的服务端地址,这里就和配置数据库一样了,要在全局配置文件中进行配置。(注:因为测试缓存需要用到数据库,所以这里一并配置)

application.yaml:

spring:
  datasource:
    username: root
    password: **********
    url: jdbc:mysql://localhost:3306/demo
    driver-class-name: com.mysql.cj.jdbc.Driver
  redis:
    host: 127.0.0.1 //这里是配置redis服务端的ip地址,本地的话写127.0.0。1或者localhost都可以

我们操作非结构化的数据时,都是以key-value的方式去操作它的,redis也不例外。关于redis的各种命令以及数据类型这里就不介绍了,可以查看它的中文官方文档

SpringBoot为咱们提供了RedisTemplate类来专门操作redis
,看名字就知道,和JdbcTemplate大致一样。它的键值对都是object类型的,也就是说可以放任意类型的值作为键值对。但有时候我们的键值对使用String类型的情况比较多,SpringBoot也为我们提供了专门的类StringRedisTemplate,我们来看看一个简单的例子:

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    
    @Test
    public void textRedis(){
        stringRedisTemplate.opsForValue().append("demo","hello world");
        String demo = stringRedisTemplate.opsForValue().get("demo");
        

(这里说明一下opsForValue方法是专门redis的字符串类型的,其他的数据类型,比如set-----opsForSet、list-----opsForList,其他同理),运行结果:

hello world

其他的数据类型也大致同理,根据方法命名即可猜出操作.

接下来看看RedisTemplate,它的key-value可以存对象,可是它存储时用到的序列化器是jdk的序列化,我们可以存进去,但是redis的可视化工具里是看不出效果,我们想用json类型的方式来存储数据的话,就需要自己来去更换它了。有一个思路就是自己编写一个RedisTemplate来替代默认配置的,并替换它的序列化器为json类型的序列化器。

编写一个配置类:

@Configuration
public class RedisConfiguration {

    @Bean
    public RedisTemplate<Object, User> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, User> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<User>(User.class); //Jackson2JsonRedisSerializer是json类型的序列化器

        template.setDefaultSerializer(jackson2JsonRedisSerializer); //设置序列化器
        return template;
    }
}

之后在编写测试代码:

    @Autowired
    private RedisTemplate<Object,User> redisTemplate;

    @Test
    public void textRedis(){
        User user = new User();
        user.setUsername("leslie");
        user.setPassword("123");


        redisTemplate.opsForSet().add("demo1",user);
        Set<User> demo = redisTemplate.opsForSet().members("demo1");
        System.out.println(demo);

//        stringRedisTemplate.opsForValue().append("demo","hello world");
//        String demo = stringRedisTemplate.opsForValue().get("demo");
//        System.out.println(demo);
    }

其中User是我们自己编写的实体类,有三个属性(uid,username,password)

运行结果:

[User{uid=0, username='leslie', password='123'}]

这样缓存内的对象就可以以json方式保存了,但是现在只能保存User类型的对象,如果需要保存别的类型,只需要在泛型那儿修改就可以了.

发布了60 篇原创文章 · 获赞 64 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Jokeronee/article/details/105729165
今日推荐