分布式缓存(五) SpringCache

为什么要使用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;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值