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 整体架构
图来自网上,画的很好,借用了,侵权删
分别是CachingProvider, CacheManager, Cache, Entry 和 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官方文档:
名称 | 位置 | 描述 | 示例 |
---|---|---|---|
methodName | root对象 | 当前被调用的方法名 | #root.methodname |
method | root对象 | 当前被调用的方法 | #root.method.name |
target | root对象 | 当前被调用的目标对象实例 | #root.target |
targetClass | root对象 | 当前被调用的目标对象的类 | #root.targetClass |
args | root对象 | 当前被调用的方法的参数列表 | #root.args[0] |
caches | root对象 | 当前方法调用使用的缓存列表 | #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 轻松搞定缓存的主要内容,如果未能解决你的问题,请参考以下文章