25、springboot与缓存整合Redis

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

 

docker:
安装Redis:

 

 

查看官方文档:
添加约束

 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</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;
    }
}

 

在配置文件中引入redis的地址:

 

测试:
此时两个操作redis的类都在容器中:
//操作kv键值对的
@Autowired
RedisTemplate redisTemplate;

//操作kv都是字符串
@Autowired
StringRedisTemplate stringRedisTemplate;

 

 

测试:

 

测试添加对象:
 
对象实现类需要实现序列化
public class Employee  implements Serializable {

 

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

 

 

//测试天对保存对象2
 
首先是自动一序列化器
@Configuration
public class redisConfig {
    //专门序列化Employee
    @Bean
    public RedisTemplate<Object, Employee> redisTemplateEmp(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Employee> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);

        Jackson2JsonRedisSerializer<Employee> json = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
        template.setDefaultSerializer(json);
        return template;
    }
}

 

 

@Autowired
RedisTemplate redisTemplateEmp;

//测试保存对象
@Test
public  void test2(){
    //保存的是emp的对象
    Employee emp = employeeMapper.getEmpById(1);
    //将数据以json的方式
    //实现redisTemplate默认的序列化规则,改变默认的序列化规则
    redisTemplateEmp.opsForValue().set("emp1",emp);
}

 

 

 

测试缓存:

原理:
1、引入redis的starter,容器自动导入的是RedisCacheManage
2、RedisCacheManager帮我们自动创建RedisCache, redis通过操作redis缓存数据的
RedisCacheConfiguration.class

@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory, ResourceLoader resourceLoader) {
    RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(this.determineConfiguration(resourceLoader.getClassLoader()));
    List<String> cacheNames = this.cacheProperties.getCacheNames();
    if (!cacheNames.isEmpty()) {
        builder.initialCacheNames(new LinkedHashSet(cacheNames));
    }

    return (RedisCacheManager)this.customizerInvoker.customize(builder.build());
}

 

protected Collection<RedisCache> loadCaches() {
    List<RedisCache> caches = new LinkedList();
    Iterator var2 = this.initialCacheConfiguration.entrySet().iterator();

    while(var2.hasNext()) {
        Entry<String, RedisCacheConfiguration> entry = (Entry)var2.next();
        caches.add(this.createRedisCache((String)entry.getKey(), (RedisCacheConfiguration)entry.getValue()));
    }

    return caches;
}
 
查询之后。再点击刷新依然是这个页面

 

3、默认保存数据都是k-v都是object,利用序列化来保存   
查看缓存:

 

4、让保存的数据为json
    1.引入redis的starter,cacheManager变为RedisCacheManager
    2.默认创建的RedisCacheManager,再操作数据的     RedisConnectionFactory 
    RedisCacheConfiguration

 

@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory, ResourceLoader resourceLoader) {
    RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(this.determineConfiguration(resourceLoader.getClassLoader()));
    List<String> cacheNames = this.cacheProperties.getCacheNames();
    if (!cacheNames.isEmpty()) {
        builder.initialCacheNames(new LinkedHashSet(cacheNames));
    }

    return (RedisCacheManager)this.customizerInvoker.customize(builder.build());
}

 

 

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

 

 

  3.默认使用的是JdkSerializationRedisSerializer
RedisTemplate.java

public void afterPropertiesSet() {
    super.afterPropertiesSet();
    boolean defaultUsed = false;
    if (this.defaultSerializer == null) {
        this.defaultSerializer = new JdkSerializationRedisSerializer(this.classLoader != null ? this.classLoader : this.getClass().getClassLoader());
    }

}

 

    4.自定义
springboot的1.5

 

posted @ 2019-02-26 09:34  MrChengs  阅读(273)  评论(0编辑  收藏  举报