SpringCache使用配置

项目中引入SpringCache

  1. pom文件引入依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    
  2. 配置文件指定缓存类型

    spring:
      cache:
        type: redis
    
  3. 启动类开启缓存注解@EnableCaching

springEl表达式

  • methodName:当前被调用的方法名

    • #root.methodName
  • args:当前被调用的方法的参数列表

    • #root.args[0]
  • result:方法执行后的返回值

    • #result

注解使用

  • Cacheable注解

    • 标记在一个方法上,也可以标记在一个类上
    • 缓存标注对象的返回结果,标注在方法上缓存该方法的返回值,标注在类上缓存该类所有的方法返回值
    • value:缓存名称,可以有多个
    • key:缓存的key规则,可以用springEL表达式,默认是方法的参数组合
    • condition:缓存条件,使用springEL编写,返回true才缓存
    @Cacheable(value = "user:page",key = "#pageNum+'_'+#pageSize")
    public Map<String, Object> page(Integer pageNum, Integer pageSize) {
        Map<String,Object> map = new HashMap<>();
    
        Page<User> page = new Page<>(pageNum,pageSize);
        Page<User> listPage = this.userMapper.selectPage(page, null);
    
        map.put("totalRecord",listPage.getTotal());
        map.put("totalPage",listPage.getPages());
        map.put("list",listPage.getRecords());
        return map;
    }
    
  • CachePut注解:更新缓存

    @CachePut(value = "user", key = "#user.id")
    public User update(User user) {
        this.userMapper.updateById(user);
        return this.userMapper.selectById(user.getId());
    }
    
  • CacheEvict注解:删除缓存

    • beforeInvocation = true:缓存清除是否在方法之前执行,默认false
    @CacheEvict(value = "user", key = "#id", beforeInvocation = true)
    public boolean delete(Integer id) {
        int i = 1 / 0;
        return this.userMapper.deleteById(id) > 0;
    }
    
  • Caching

    • 组合多个Cache注解使用
    • 允许在同一方法上使用多个嵌套的@Cacheable、@CachePut、@CacheEvict注解
    @Caching(cacheable = {@Cacheable(value = "user1", key = "#user.id")},
             put = {@CachePut(value = "user2", key = "#user.id")})
    public User update(User user) {
        this.userMapper.updateById(user);
        return this.userMapper.selectById(user.getId());
    }
    

SpringCache框架自定义cacheManager配置过期时间

  • 配置类

    /**
     * 过期时间1h
     *
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisCacheManager redisCacheManager1Hour(RedisConnectionFactory redisConnectionFactory) {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        objectMapper.registerModule(new JavaTimeModule());
        objectMapper.configure(MapperFeature.USE_ANNOTATIONS, false);
        // 只缓存非空值
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        // 将类型序列化到属性json字符串中
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
    
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
    
        RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofHours(1))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer));
    
        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(configuration)
                .transactionAware().build();
    }
    
  • Service类使用

    @Cacheable(value = "user:page",key = "#pageNum+'_'+#pageSize", cacheManager = "redisCacheManager1Hour")
    public Map<String, Object> page(Integer pageNum, Integer pageSize) {
        Map<String,Object> map = new HashMap<>();
    
        Page<User> page = new Page<>(pageNum,pageSize);
        Page<User> listPage = this.userMapper.selectPage(page, null);
    
        map.put("totalRecord",listPage.getTotal());
        map.put("totalPage",listPage.getPages());
        map.put("list",listPage.getRecords());
        return map;
    }
    

SpringCache框架自定义keyGenerator

  • key规则定义配置类

    /**
     * 自定义缓存key规则
     *
     * @return
     */
    @Bean
    public KeyGenerator keyGenerator() {
        return (obj, method, args) -> obj.getClass().getSimpleName() + "_" + method.getName() + "_" + StringUtils.arrayToDelimitedString(args, "_");
    }
    
  • Service类使用,key和keyGenerator只能二选一

    @Cacheable(value = "user:page", keyGenerator = "keyGenerator")
    public Map<String, Object> page(Integer pageNum, Integer pageSize) {
        Map<String, Object> map = new HashMap<>();
    
        Page<User> page = new Page<>(pageNum, pageSize);
        Page<User> listPage = this.userMapper.selectPage(page, null);
    
        map.put("totalRecord", listPage.getTotal());
        map.put("totalPage", listPage.getPages());
        map.put("list", listPage.getRecords());
        return map;
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用Spring Cache时,需要在Maven配置文件中添加相应的依赖。可以通过引入以下Maven坐标来导入Spring Cache相关依赖: ```xml <!-- 拓展缓存技术的整合 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <!-- 含RedisCacheManager --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 这些依赖将帮助我们实现基于注解的缓存功能,并且支持使用Redis作为缓存管理器。 在进行Spring Cache的Maven配置后,还需要进行相应的yml配置和编写RedisConfig配置类以及RedisController类等。这些配置和类的详细内容可以参考SpringBoot2.0整合SpringCache和Redis的实战教程。 总的来说,Spring Cache是一个框架,通过注解可以实现缓存功能。它提供了一层抽象,底层可以切换不同的缓存技术,而CacheManager则是Spring提供的各种缓存技术的抽象接口。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Spring Cache入门(简介+maven坐标+yml文件配置+常用注解)](https://blog.csdn.net/m0_64037602/article/details/126732633)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [SpringBoot2.0整合SpringCache和Redis.docx](https://download.csdn.net/download/charles0902/12255390)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水宝的滚动歌词

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值