当前位置:   article > 正文

使用SpringCache简化缓存开发(redis)_spring.cache.redis.key-prefix=cache_

spring.cache.redis.key-prefix=cache_

一、导入坐标

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

二、写配置

1、在启动类上添加开启缓存注解@EnableCaching

2、 可以往application.properties配置文件中添加以下配置

①、设置使用什么作为缓存

spring.cache.type=redis 

②、设置过期时间

  1. #设置过期时间
  2. spring.cache.redis.time-to-live=360000

③、设置缓存前缀

  1. #设置缓存前缀 一旦设置了前缀,那么将不启用缓存的名字
  2. spring.cache.redis.key-prefix=CACHE_
  3. #开启缓存前缀,如果使用缓存前缀,那么缓存的key名字就会加上前缀
  4. spring.cache.redis.use-key-prefix=true

例如以下代码

  1. @Cacheable(value = {"category"}, key = "#root.method.name", sync = true)
  2. @Override
  3. public List<CategoryEntity> getLevel1Categorys() {
  4. System.out.println("查询了数据库");
  5. return baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("cat_level", 1));
  6. // 测试能否缓存null值
  7. // return null;
  8. }

如果没有设置缓存前缀时,redis中的数据:会使用value中的值作为缓存名字

如果设置了缓存前缀,但是不开启缓存前缀:

设置了缓存前缀并且开启

④、设置缓存空值,防止缓存穿透

  1. #缓存空值
  2. spring.cache.redis.cache-null-values=true

三、自定义缓存配置

  1. @EnableConfigurationProperties(CacheProperties.class)
  2. @EnableCaching
  3. @Configuration
  4. public class MyCacheConfig {
  5. /**
  6. * 配置文件中 TTL设置没用上
  7. *
  8. * 原来:
  9. * @ConfigurationProperties(prefix = "spring.cache")
  10. * public class CacheProperties
  11. *
  12. * 现在要让这个配置文件生效 : @EnableConfigurationProperties(CacheProperties.class)
  13. *
  14. */
  15. @Bean
  16. RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties){
  17. RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
  18. // 设置kv的序列化机制
  19. config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
  20. config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
  21. CacheProperties.Redis redisproperties = cacheProperties.getRedis();
  22. // 设置配置
  23. if(redisproperties.getTimeToLive() != null){
  24. config = config.entryTtl(redisproperties.getTimeToLive());
  25. }
  26. if(redisproperties.getKeyPrefix() != null){
  27. config = config.prefixKeysWith(redisproperties.getKeyPrefix());
  28. }
  29. if(!redisproperties.isCacheNullValues()){
  30. config = config.disableCachingNullValues();
  31. }
  32. if(!redisproperties.isUseKeyPrefix()){
  33. config = config.disableKeyPrefix();
  34. }
  35. return config;
  36. }
  37. }

四、缓存

1、添加缓存(查询数据时)(sync=true : 加锁)

  1. @Cacheable(value = {"category"}, key = "#root.method.name", sync = true)
  2. @Override
  3. public List<CategoryEntity> getLevel1Categorys() {
  4. System.out.println("查询了数据库");
  5. return baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("cat_level", 1));
  6. // 测试能否缓存null值
  7. // return null;
  8. }

2、修改缓存(失效模式(更改数据后清除缓存))

  1. @CacheEvict(value = {"category"}, key = "'getLevel1Categorys'")
  2. @Override
  3. public void updateCascade(CategoryEntity category) {
  4. this.updateById(category);
  5. categoryBrandRelationService.updateCategory(category.getCatId(), category.getName());
  6. }

3、修改缓存(失效模式,清空多个缓存)

  1. @Caching(evict = {
  2. @CacheEvict(value = {"category"}, key = "'getLevel1Categorys'"),
  3. @CacheEvict(value = {"category"}, key = "'getCatelogJson'")
  4. })
  5. @Override
  6. public void updateCascade(CategoryEntity category) {
  7. this.updateById(category);
  8. categoryBrandRelationService.updateCategory(category.getCatId(), category.getName());
  9. }

4、修改缓存(失效模式,删除某一个分区下的所有数据“allEntries = true”)

  1. @CacheEvict(value = {"category"}, allEntries = true)
  2. @Override
  3. public List<CategoryEntity> getLevel1Categorys() {
  4. System.out.println("查询了数据库");
  5. return baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("cat_level", 1));
  6. // 测试能否缓存null值
  7. // return null;
  8. }

三、注解介绍

默认行为:

       1、 key自动生成    默认名字 : 缓存的名字::simplekey【】(自主生成的key)

        2、缓存的value,默认使用jdk的序列化,将序列化后的内容存到redis中

        3、默认的过期时间是永不过期

  1. //用在类上
  2. @CacheConfig(cacheNames = "bank") 用在类上,方法中则可以省略cacheNames 配置
  3. // 用在方法上
  4. @Cacheable: 先判断有没有缓存,有就取缓存,否则查库后再存入缓存,一般用在get 方法上(不支持设置缓存时间)
  5. @CachePut: 操作后结果存入缓存 ,一般用在update上
  6. @CacheEvict: 清除缓存 ,一般用在delete
  7. @Caching 多个Cache组合使用
  8. @Caching(
  9. put = {
  10. @CachePut(value = "bank",key="#bank.bankId"),
  11. @CachePut(value = "bank",key="#bank.bankNo")
  12. }
  13. )
  14. public BankVO save(){}
  15. 自定义缓存注解(@Caching组合,会让方法上的注解显得整个代码比较乱)
  16. @Caching(
  17. put = {
  18. @CachePut(value = "bank",key="#bank.bankId"),
  19. @CachePut(value = "bank",key="#bank.bankNo")
  20. }
  21. )
  22. @Target({ElementType.METHOD, ElementType.TYPE})
  23. @Retention(RetentionPolicy.RUNTIME)
  24. @Inherited
  25. public @interface UserSaveCache {
  26. }
  27. value/cacheNames 缓存的名字,必须指定至少一个, 也可以放在CacheConfig()中
  28. key 缓存的key,可以为空,如果指定要按照SpEl表达式编写,如果不指定,则按照所有参数进行组合
  29. condition 缓存的条件,可以为空,使用SpEL编写,返回truefalse,只有为true才进行缓存
  30. allEntries 是否清空所有缓存内容,默认为false,如果指定为true,则方法调用后立即清空所有缓存
  31. beforeInvocation 是否在方法执行前就清空,默认为false(如果抛了异常则不会清空缓存),如果指定为true,则在方法还没有执行的时候就清空缓存

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/389670
推荐阅读
相关标签
  

闽ICP备14008679号