Springboot使用@Cacheable 更优雅的使用缓存 以及如何设置失效时间

30 篇文章 3 订阅

从注解的名字就可以看出该注解是一个缓存相关的注解, 在不引入分布式缓存(redis等)的前提下, spring 会默认提供一个缓存(本地缓存 CacheManager)提供使用.

缓存的应用场景

 高频词汇, 热点信息, 变化不大等等....的数据, 避免频繁的访问数据库

 相关注解

@Cacheable  主要是针对方法的配置,能够根据方法的求情参数对其结果进行缓存。

@CachePut    保证方法被调用,又希望结果被缓存 缓存更新

@CacheEvict  清空缓存  删除数据时的方法。

@EnableCaching  开启基于注解的缓存

使用方法

这里为了节省时间 只讲解@Cacheable的使用, 其他更新删除大同小异

 测试

首先查询一个缓存中没有的数据, 缓存中没有所以去查数据库, 并把结果存到缓存中

再次查询这个code值时, 就会发现直接查询缓存了.

比起以往的先查缓存, 如果没有再查数据库是不是优雅的多了.

当然spring底层实现也是如此, 借用aop的原理, 在执行方法前进行相应的操作

 

参数介绍

cacheNames: 缓存的key的目录名
key: key 名 支持三元表达式
unless: 什么条件下不缓存, 如上图当结果的结果为0时不缓存
condition: 什么时候缓存, 与unless相反
syns:缓存是否使用异步模式
cachemanager:指定缓存管理器

失效时间问题

spring并没有单独为Cacheable指定失效时间的设置, 我们可以对CacheManager进行配置, 达到我们想要的效果.

可以自定义一个cacheManager, 如下图的RedisCacheManager

该构造方法需要3个参数, 分别是

  • cacheWriter : 需要一个缓存写入器
    
  • defaultCacheConfiguration: 默认的失效配置, 理解为默认的配置及失效时间
  • initialCacheConfigurations: 可以自定义缓存配置

我的redis 缓存相关 具体配置文件, 如下, 可直接拷贝使用

 @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        return new RedisCacheManager(
                RedisCacheWriter.lockingRedisCacheWriter(factory),
                this.getRedisCacheConfigurationWithTtl(1),
                this.getRedisCacheConfigurationMap()
        );
    }

    /**
     * 默认失效时间配置
     *
     * @param days 未设置失效事件的key 默认days失效
     */
    private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer days) {
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        return RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(
                RedisSerializationContext
                        .SerializationPair
                        .fromSerializer(jackson2JsonRedisSerializer)).entryTtl(Duration.ofDays(days));
    }

    public static final String REGION_LIST_BY_CODE_CACHE_KEY = "region:list";
    public static final String REGION_NAME_BY_CODE_CACHE_KEY = "region:name";

    /**
     * 已知缓存名称的映射以及用于这些缓存的配置
     */
    private Map<String, RedisCacheConfiguration> getRedisCacheConfigurationMap() {
        Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>();
        // 自定义缓存名称对应的配置
        redisCacheConfigurationMap.put(REGION_LIST_BY_CODE_CACHE_KEY, this.getRedisCacheConfigurationWithTtl(5));
        redisCacheConfigurationMap.put(REGION_NAME_BY_CODE_CACHE_KEY, this.getRedisCacheConfigurationWithTtl(10));
        return redisCacheConfigurationMap;
    }

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
@Cacheable是Spring Boot中用于实现缓存的注解之一。在使用@Cacheable时,需要在方法上添加该注解,并指定缓存的名称和缓存的键值。根据不同的缓存解析器和缓存管理器,可以选择在方法参数或方法返回值上使用SpEL表达式来生成缓存的键值。 例如,在使用@Cacheable时,可以通过在方法上添加该注解,并指定cacheNames和key属性来实现缓存功能。其中,cacheNames指定了要使用缓存的名称,可以通过在配置文件中配置相应的缓存管理器来定义这个名称。key属性用于生成缓存的键值,可以使用SpEL表达式来引用方法参数或其他属性,以生成动态的键值。 示例代码如下: ``` @Cacheable(cacheNames = "emp", key = "#name") public String getString1(String name) { // 方法的具体实现 } ``` 在上述示例中,@Cacheable注解被应用于方法getString1上。cacheNames属性指定缓存的名称为"emp",key属性使用了SpEL表达式"#name"来引用方法的参数name作为缓存的键值。 需要注意的是,使用@Cacheable注解时,需要确保已经配置了合适的缓存解析器和缓存管理器。可以使用默认的SimpleCacheResolver或者自定义的CacheResolver类来实现灵活的缓存解析。 总结起来,@Cacheable注解可以通过指定cacheNames和key属性来实现方法级的缓存功能,使得方法的结果可以被缓存起来,提高系统的性能和响应速度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SpringBoot @Cacheable缓存注解的使用](https://blog.csdn.net/qq_28834355/article/details/109559302)[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* [springboot @Cacheable 基本使用](https://blog.csdn.net/weixin_39602579/article/details/112044641)[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 ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值