32springboot——缓存之整合Redis

Posted Arbitrary233

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了32springboot——缓存之整合Redis相关的知识,希望对你有一定的参考价值。

springboot缓存默认使用ConcurrentMapCacheManager 将数据保存在下面的Map中

1、docker中开启Redis

 2、添加Redis相关依赖

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

我还多加了下面这个依赖才不会报错,具体原因尚未了解

<dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
</dependency>

此时redis就引入再容器中

可以查看自动配置的类(RedisAutoConfiguration.class)分别注入了操作对象的类和操作字符串的类
public class RedisAutoConfiguration {
    public RedisAutoConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean(
        name = {"redisTemplate"}
    )
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

4、在配置文件中引入redis服务所在的ip地址:

 5、测试

测试:
此时两个操作redis的类都在容器中,在测试的时候直接进行注入使用
    @Autowired
    StringRedisTemplate stringRedisTemplate;    //操作k-v都是字符串的
    @Autowired
    RedisTemplate redisTemplate;        //操作k-v都是对象的

    @Test
    public void testRedis(){
        //给redis中保存数据
        stringRedisTemplate.opsForValue().append("name","lisi");
        //读数据
        String name = stringRedisTemplate.opsForValue().get("name");
        System.out.println(name);
        //放列表
        stringRedisTemplate.opsForList().leftPush("myList","1");
        stringRedisTemplate.opsForList().leftPush("myList","2");
        stringRedisTemplate.opsForList().leftPush("myList","3");
    }

在Redis Desk Manager中可以看到存入成功

 使用redisTemplate测试添加对象:

  插入的对象实现类需要实现序列化

public class Employee  implements Serializable {
//测试保存对象
@Test
public  void test2(){
    //保存的是emp的对象
    Employee emp = employeeMapper.getEmpById(1);
    //保存的是employee的对象
    //默认如果使用保存对象,使用jdk序列化机制,序列化后的数据保存在redis中
    redisTemplate.opsForValue().set("emp01",emp);
}

插入后的数据如下:

 因为这个redisTemplate默认使用的是jdk的序列化机制

 想要保存为json序列化格式则可以自定义一个redisTemplate进行设置json的序列化机制

  创建一个MyRedisConfig类进行Redis自定义的相关配置

@Configuration
public class MyRedisConfig {
    //专门以json格式序列化Employee
    @Bean
    public RedisTemplate<Object, Employee> empRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Employee> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
        template.setDefaultSerializer(jackson2JsonRedisSerializer);
        return template;
    }
}

下面的代码是RedisAutoConfiguration源码中注入默认RedisTemplate的代码

    @Bean
    @ConditionalOnMissingBean(
        name = {"redisTemplate"}
    )
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

进行对比可以发现我们只是增加了json格式的序列化机制(红色部分代码)

还有其他的序列化机制(如下图),需要的时候进行配置即可

 此时在测试代码中再使用我们自己注入的empRedisTemplate

@Autowired              //注入
RedisTemplate<Object, Employee> empRedisTemplate;
//测试保存对象
@Test
public  void test2(){
    //保存的是emp的对象
    Employee emp = employeeMapper.getEmpById(1);
    //保存的是employee的对象
    //默认如果使用保存对象,使用jdk序列化机制,序列化后的数据保存在redis中
    empRedisTemplate.opsForValue().set("emp01",emp);
}

可以看到插入的数据就是json格式了

 

以上是关于32springboot——缓存之整合Redis的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot缓存管理之整合Redis缓存的实现

SpringBoot2.0实战(23)整合Redis之集成缓存SpringDataCache

SpringBoot整合Redis入门之缓存数据

SpringBoot(二十七)整合Redis之分布式锁

九springboot整合redis二之缓冲配置

lettuce之springboot整合redis