为什么要使用SpringCache呢?
每次写代码的时候,都要先从缓存中去取,然后又放入到缓存中去,比较麻烦,考虑简化的方式
1.简介
spring从3.1开始定义了Cache和CacheManager接口来统一不同的缓存技术,并支持使用JCache注解简化开发
Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;
Cache接口下Spring提供了各种xxxCache的实现,如RedisCache,EhCacheCache,ConcurrentMapCacheManager等等
CacheManager缓存管理器
可以用来管理不同名字的缓存
2个方法:
getCache(String name);
Collection<String> getCacheNames();
Cache缓存接口
相当于对缓存的增删改查
例如:ConcurrentMapCacheManager 最终内部是一个 ConcurrentMap<String, Cache> cacheMap = new ConcurrentMap<>();
2.整合SpringCache
2.1 引入依赖
spring-boot-starter-cache + redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2.2 写配置
2.2.1 SpringBoot自动配置了哪些?
CacheAutoConfiguration会导入
RedisCacheConfiguration,其中,已经
自动配置好了缓存管理器
RedisCacheManager
2.2.2 程序员需要做哪些?
配置使用redis作为缓存 spring.cache.type=redis
3.测试使用缓存
@Cacheable: 触发,将数据保存到缓存的操作
@CacheEvict:
触发,将数据从缓存删除的操作
@CachePut: 不影响方法执行更新缓存
@Caching: 组合以上多个操作
@CacheConfig: 在类级别共享缓存的相同配置
步骤:1.开启缓存功能
@EnableCaching
2.只需要使用注解就能完成缓存操作
eg:@Cacheable注解加到方法上,代表当前方法的结果需要缓存,如果缓存中有,方法都不用调用了;如果缓存中没有,会调用方法
@Cacheable({"
category"}) //缓存的分区,--按照业务类型进行区分
@Cacheable("category")
// 代表当前方法的结果需要缓存,如果缓存中有,下面的方法就不调用了;
// 如果缓存中没有,会调用方法,最后将方法的结果放入缓存
// 每一个缓存的数据我们都来指定要放到哪个名字的缓存 【缓存的分区(按业务类型分)】
@Override
public List<CategoryEntity> getLevelOneCategory() {
System.out.println("getLevelOneCategory ......");
//获取当前系统时间
Long l = System.currentTimeMillis();
QueryWrapper<CategoryEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("parent_cid",0);
List<CategoryEntity> entities = baseMapper.selectList(queryWrapper);
System.out.println("测试消耗时间为"+(System.currentTimeMillis()-l));
return entities;
}
SpringCache的默认行为
1.缓存中的key默认自动生成,名字::SimpleKey []
2.缓存的value值,默认使用jdk序列化机制,将序列化后的数据存到redis中
3.默认的ttl时间 -1
程序员自定义配置
1.指定生成的key: key属性指定,接受一个spel表达式 : @Cacheable(value = "category",
key="'level1Categorys'")
2.指定缓存的存活时间 配置文件中设置 spring.cache.redis.time-to-live=3600000
3.将数据保存为json格式
CacheAutoConfiguration会导入
RedisCacheConfiguration,其中,已经
自动配置好了缓存管理器
RedisCacheManager
--> 初始化所有的缓存,每个缓存决定使用什么配置,如果
RedisCacheConfiguration有就用已有的,没有就用默认配置
--> 想改缓存的配置,只需要给容器中放一个
RedisCacheConfiguration即可,就会应用到当前RedisCacheManager管理的所有缓存分区中
自定义缓存配置: 需要理解SpringBoot相关
@EnableConfigurationProperties(CacheProperties.class)
@Configuration
@EnableCaching
public class MyCacheConfig {
// @Autowired
// CacheProperties cacheProperties;
@Bean
RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties){
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
CacheProperties.Redis redisProperties = cacheProperties.getRedis();
if (redisProperties.getTimeToLive() != null) {
config = config.entryTtl(redisProperties.getTimeToLive());
}
if (redisProperties.getKeyPrefix() != null) {
config = config.prefixKeysWith(redisProperties.getKeyPrefix());
}
if (!redisProperties.isCacheNullValues()) {
config = config.disableCachingNullValues();
}
if (!redisProperties.isUseKeyPrefix()) {
config = config.disableKeyPrefix();
}
return config;
}
}