Spring从3.1开始定义了一系列抽象接口来统一不一样的缓存技术;并支持使用JCache(JSR-107)注解简化咱们进行缓存开发。Spring Cache 只负责维护抽象层,具体的实现由你的技术选型来决定。将缓存处理和缓存技术解除耦合。java
Spring cache 抽象由spring-context相关组件实现。非Spring Boot 项目可经过引入该模块进行集成。git
Spring Boot 项目可引入如下依赖:redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
复制代码
同时可能须要引入你采用的缓存中间件客户端;好比 Ehcache、redis等。spring
Spring cache 提供了一系列的注解,将咱们从编程开发中解放出来。让咱们更加关注于业务开发。apache
该注解是启用Spring cache 的开关。必须开启才能使用Spring cache相关功能。编程
能够标记在一个方法或者类上。方法级只针对该方法。类上则针对类内全部的方法。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用一样的参数来执行该方法时能够直接从缓存中获取结果,而不须要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果。缓存
public @interface Cacheable {
@AliasFor("cacheNames")
String[] value() default {};
//和value注解差很少,二选一
String[] cacheNames() default {};
// 该次缓存的key
String key() default "";
//key的生成器。key/keyGenerator二选一使用
String keyGenerator() default "";
//指定缓存管理器 通常使用默认
String cacheManager() default "";
//或者指定获取解析器 通常使用默认
String cacheResolver() default "";
//条件符合则缓存 使用的比较多 支持SpEL
String condition() default "";
//条件符合则不缓存 使用的比较多 支持SpEL
String unless() default "";
//是否使用异步模式
boolean sync() default false;
}
复制代码
后面有个别注解属性跟这个基本相同不进行重复介绍。less
做用于缓存接口上,来对该接口下的一些重复配置(缓存名称、key生成器、缓存管理器、缓存处理器)进行概括处理。其余属性可参考Cacheable。异步
该注解容易跟@Cacheable混淆。二者均可以执行缓存的“放入”操做,不一样于@Cacheable,@CachePut每次都将执行方法并将返回值K-V放入缓存,若是该K存在则进行更新。其余属性可参考Cacheable。spring-boot
@CachEvict主要针对方法配置,可以根据必定的条件对特定的缓存进行清空。该注解有两个特别的属性:
该注解是个组合注解。有时候咱们须要在一个方法上同时使用多个相同注解可是java是不支持一个注解在同一个方法上屡次使用。这时就可使用该注解进行组合。
接下来咱们经过Spring cache 集合redis 来实战一下,甚至有一些特别的玩法。假设redis环境已经搭建好了。Spring Boot 项目中引入:
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- spring cache -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- lettuce 必备依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
复制代码
在yml配置中咱们大多可以使用默认配置。配置spring.cache.type=REDIS
。其余配置可经过前缀
spring.cache
、spring.redis
进行配置。
Spring Boot 2.x中 默认使用lettuce做为默认redis客户端。固然你也能够引入redisson客户端。建议放弃阻塞客户端jedis。
若是咱们使用默认的配置那么全部的K-V都不会自动过时。不少状况下咱们有这样的需求,验证码缓存5分钟自动过时,区域信息30分钟。那么咱们就须要自定义 CacheManager。代码以下:
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
return RedisCacheManager.RedisCacheManagerBuilder.fromCacheWriter(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
// 默认策略,未配置的 key 会使用这个
.cacheDefaults(redisConfig(60))
// 自定义 key 策略
.withInitialCacheConfigurations(redisCacheConfigurationMap()).build();
}
复制代码
cacheDefaults方法用来指定默认配置,withInitialCacheConfigurations方法用来对各类缓存空间进行个性化配置。redisCacheConfigurationMap方法是一个以缓存名称为key,其对应的redis配置类为值得键值映射。这个须要在开发中本身进行配置。参考CacheNameEnum
。
通过上面的配置后,咱们编写如下缓存类:
/**
* The type Captcha cache.
*
* @author dax
* @since 2019 /9/2 21:31
* @see cn.felord.rediscache.config.CacheNameEnum
*/
@Slf4j
@Component
@CacheConfig(cacheNames = {"smsCode"})
public class CaptchaCache {
@CachePut(key = "#key")
public String put(String key,String code){
log.info("执行 cachePut");
return code;
}
@CacheEvict(key = "#key")
public void expire(String key){
}
@Cacheable(key = "#key")
public String get(String key){
return null;
}
}
复制代码
请注意 缓存名称 smsCode
在CacheNameEnum
进行了个性化配置。
到上面咱们的spring cache 缓存就搞完了。样例已经上传到了个人码云仓库,你能够经过如下地址:
https://gitee.com/felord/redis-cache获取demo,结合本文进行学习一些高级玩法来应对你的业务开发。
关注公众号:码农小胖哥,获取更多资讯