Springboot cache 轻松搞定缓存

Posted 香菜+

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot cache 轻松搞定缓存相关的知识,希望对你有一定的参考价值。

1、应用

最近在接天气的api,因为天气更新有时间段,所以需要在程序中使用缓存,springboot直接集成,拿来用就行了,不做挣扎,这里也是介绍这个。

2、代码应用

2.1 导入引用

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

2.2 在程序中使用

因为这个应用场景简单,所以没有使用redis 作缓存,如果你有这方面的需求,可以直接切成redis 作缓存。

在主类开启缓存  @EnableCaching

@SpringBootApplication
@RetrofitScan("pweather.client")
@EnableCaching
@EnableScheduling
public class CcpWeatherApplication 

    public static void main(String[] args) 
         SpringApplication.run(CcpWeatherApplication.class, args);

    


2.3 在service中使用缓存

@Service
@CacheConfig(cacheNames = "weather")
public class WeatherService 
    @Resource
    IWeatherComClient weatherComClient;
    @Value("$weather.key")
    String key;
    @Value("$weather.city_code")
    String cityCode;
    @Resource
    CacheManager cacheManager;

    @Cacheable(key = "#root.methodName", unless = " #result.startsWith('CC')")
    public String getTodayWeather() 
        String weather = weatherComClient.getWeather(cityCode, "observe|alarm", key);
        return weather;
    


3、cache 的技术

3.1 整体架构

图来自网上,画的很好,借用了,侵权删

分别是CachingProviderCacheManagerCacheEntry 和 Expiry

  • CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider

  • CacheManager定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有
  • Cache是一个类似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个CacheManager所拥有
  • Entry是一个存储在Cache中的key-value对

  • Expiry 每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置

 3.2 注解

@Cacheable主要针对方法配置,能够根据方法的请求参数对其进行缓存
@CacheEvict清空缓存
@CachePut保证方法被调用,又希望结果被缓存。
与@Cacheable区别在于是否每次都调用方法,常用于更新
@EnableCaching开启基于注解的缓存

3.3 注解参数

名称解释
value缓存的名称,在 spring 配置文件中定义,必须指定至少一个
例如:
@Cacheable(value=”mycache”) 或者
@Cacheable(value=”cache1”,”cache2”
key缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,
如果不指定,则缺省按照方法的所有参数进行组合
例如:
@Cacheable(value=”testcache”,key=”#id”)
condition缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,
只有为 true 才进行缓存/清除缓存
例如:@Cacheable(value=”testcache”,condition=”#userName.length()>2”)
unless否定缓存。当条件结果为TRUE时,就不会缓存。
@Cacheable(value=”testcache”,unless=”#userName.length()>2”)
allEntries
(@CacheEvict )
是否清空所有缓存内容,缺省为 false,如果指定为 true,
则方法调用后将立即清空所有缓存
例如:
@CachEvict(value=”testcache”,allEntries=true)
beforeInvocation
(@CacheEvict)
是否在方法执行前就清空,缺省为 false,如果指定为 true,
则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法
执行抛出异常,则不会清空缓存
例如:
@CachEvict(value=”testcache”,beforeInvocation=true)

3.4 上下文数据

Spring Cache提供了一些供我们使用的SpEL上下文数据,下表直接摘自Spring官方文档:

名称位置描述示例
methodNameroot对象当前被调用的方法名#root.methodname
methodroot对象当前被调用的方法#root.method.name
targetroot对象当前被调用的目标对象实例#root.target
targetClassroot对象当前被调用的目标对象的类#root.targetClass
argsroot对象当前被调用的方法的参数列表#root.args[0]
cachesroot对象当前方法调用使用的缓存列表#root.caches[0].name
Argument Name执行上下文当前被调用的方法的参数,如findArtisan(Artisan artisan),可以通过#artsian.id获得参数#artsian.id
result执行上下文方法执行后的返回值(仅当方法执行后的判断有效,如 unless cacheEvict的beforeInvocation=false)#result

4、一些使用心得

4.1 cacheable 和cacheput

Cacheable 主要是用的查询接口,会使用缓存

cacheput 主要是用的更新接口,无论缓存内是否存在都会更新缓存

以上是关于Springboot cache 轻松搞定缓存的主要内容,如果未能解决你的问题,请参考以下文章

轻松提高性能和并发度,springboot简单几步集成缓存

轻松提高性能和并发度,springboot简单几步集成缓存

springboot开启Cache缓存

完整SpringBoot Cache整合redis缓存

2021年百度Java面试真题,一文轻松搞定

springboot-cache缓存和J2cache二级缓存框架(带点漫画)