springboot学习之旅09-缓存

一、spring缓存抽象

springboot学习之旅09-缓存_第1张图片
idea向导引入cache、mysql、web(便于测试)


1.走向:

Cachingprovider —> CachingManager —> Cache
springboot学习之旅09-缓存_第2张图片


2.要使用缓存的话,需要在启动类上使用@EnableCaching


3.小知识点:

1)如果指定特定范围内的日志控制台输出,可在application.properties里面配置:logging.level.com.atguigu.bootcache.mapper=debug

2)查看控制台引用
加上debug = true
springboot学习之旅09-缓存_第3张图片
可以查看哪些使用了哪些没被使用

3)定义全局的key的名称,下面的调用的地方value就可以不用写,如图
springboot学习之旅09-缓存_第4张图片


4.@Cacheable的几个属性

1)cacheNames/value:指定缓存组件的名字

2)key:缓存数据使用的key,默认使用方法的参数值(使用spEL表达式,表达式规则可参考ppt) 等同于keyGenerator,二选一使用

3)cacheManager:指定缓存管理器

4)cacheResolver:指定获取解析器(与管理器二选一)

5)condition:指定符合条件下才缓存

6)unless:当unless指定的条件为true,方法的返回值就不会被缓存


5.缓存的原理

1)看CacheAutoConfiguration
springboot学习之旅09-缓存_第5张图片
2)运行步骤:
springboot学习之旅09-缓存_第6张图片


6.自定义keyGenerator

springboot学习之旅09-缓存_第7张图片


7.@CacheAble 和@CachePut

@CacheAble:先查缓存,再执行标记的方法

@CachePut:先执行方法,然后将值存入缓存


8.@CachePut使用注意

springboot学习之旅09-缓存_第8张图片

9.@CacheEvict:缓存清除
springboot学习之旅09-缓存_第9张图片
1)allEntries属性:是否全部删除,true是全部删除,不管指不指定key;

2)beforeInvocation:如果执行代码出错,可照样执行,如代码所示,默认是false


10.@Caching

是@Cacheable、@CachePut、@CacheEvict的组合注解,复杂场景下可使用组合条件

例:springboot学习之旅09-缓存_第10张图片里面是数组形式

二、redis整合

1.引入依赖

springboot学习之旅09-缓存_第11张图片

<dependency>    
    <groupId>org.springframework.bootgroupId>    
    <artifactId>spring-boot-starter-data-redisartifactId>
dependency>

redis默认访问端口 6379

2.application.properties设置

(redis地址等)

spring.redis.host=192.168.1.113

3.test类测试,引入了redis的starter后,会给容器增加两个组件如下:

springboot学习之旅09-缓存_第12张图片
(涉及两个redis模板类:StringRedisTemplate 和 RedisTemplate)

@Test
void contextLoads() {    
 stringRedisTemplate.opsForValue().append("msg","world");    System.out.println(stringRedisTemplate.opsForValue().get("msg"));
}
@Test
void test(){    
 DepartMent departMent = deptMapper.selectDept(9);    redisTemplate.opsForValue().set("dept",departMent);
}

4.自定义入库redis操作模板

(这边的例子为将部门序列化入库)

jackson2JsonRedisSerializer :json的序列化器(且该对象需实现序列化 implements Serializable)

@Configuration
public class MyRedisConfig {    
    @Bean    
    public RedisTemplate<Object, DepartMent> myRedisTemplate(RedisConnectionFactory 			redisConnectionFactory) throws UnknownHostException {       							RedisTemplate<Object, DepartMent> template = new RedisTemplate();        				template.setConnectionFactory(redisConnectionFactory);        							Jackson2JsonRedisSerializer<DepartMent> jackson2JsonRedisSerializer = new 				Jackson2JsonRedisSerializer<DepartMent>(DepartMent.class);        						template.setDefaultSerializer(jackson2JsonRedisSerializer);  //放入json的序列化器   
        return template;    
     }}

5.自定义CacheManager(springboot1.0和2.0版本有所差异)

1)1.0版本

 //缓存管理器
    @Bean
    public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        //设置缓存过期时间
        cacheManager.setDefaultExpiration(10000);
        return cacheManager;
    }    //缓存管理器

2)2.0版本

@Bean    
public static RedisCacheManager create(RedisConnectionFactory connectionFactory) {
    Jackson2JsonRedisSerializer<DepartMent> jackson2JsonRedisSerializer = new 		       		Jackson2JsonRedisSerializer<DepartMent>(DepartMent.class);       
    RedisCacheConfiguration cacheConfiguration =                RedisCacheConfiguration.defaultCacheConfig()                        .entryTtl(Duration.ofDays(1))   // 设置缓存过期时间为一天                        .disableCachingNullValues()     // 禁用缓存空值,不缓存null校验                        .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer));     // 设置CacheManager的值序列化方式为json序列化,可加入@Class属性        return RedisCacheManager.builder(connectionFactory).cacheDefaults(cacheConfiguration).build();     // 设置默认的cache组件    }

你可能感兴趣的:(spring,boot)