开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
配置
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
在启动类或者配置类使用@EnableCaching注解。 在配置类中设置缓存过期时间,根据缓存的使用情况来设置过期时间。
@Configuration
@EnableCaching
public class RedisConfig {
/**
* 缓存管理器
* 默认缓存过期时间:150分钟
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(
Duration.ofMinutes(150)).serializeKeysWith(RedisSerializationContext.SerializationPair
.fromSerializer(new StringRedisSerializer())).serializeValuesWith(RedisSerializationContext
.SerializationPair.fromSerializer(createJacksonRedisSerializer())).disableCachingNullValues();
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
return new RedisCacheManager(redisCacheWriter, config);
}
private Jackson2JsonRedisSerializer<Object> createJacksonRedisSerializer() {
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 jackson2JsonRedisSerializer;
}
}
@Cacheable
@Cacheable注解用于存储及读取缓存,当使用的方法返回的结果不为空时,会把当结果存储到缓存,结果为空则不存储。
@Cacheable的结构如下:
@Cacheable属性介绍
| 属性 | 类型 | 描述 |
|---|---|---|
| value | String[] | 缓存名称 |
| cacheNames | String[] | 缓存组件的名字, value和cacheNames二选一 |
| key | String | SpEL表达式,自定义缓存key |
| keyGenerator | String | 自动生成缓存key,key 和 keyGenerator 二选一使用 |
| cacheManager | String | 可以用来指定缓存管理器。从哪个缓存管理器里面获取缓存 |
| condition | String | SpEL表达式,指定条件下才缓存,即为true时才缓存 |
| unless | String | SpEL表达式,如果结果为true则返回值不缓存 |
| sync | boolean | 是否使用异步 |
示例:
@Cacheable(cacheNames = "getInfo", key = "#user.username")
public Object getInfo(User user) {
}
@Cacheable(cacheNames = "getUser", key = "#p0")
public Object getUser(String username) {
}
@Cacheable("users")
public Object getList(String params) {
}
@CachePut
@CachePut注解仅存储缓存,它会把方法的返回值存储到缓存,其不会去查询缓存,这是与@Cacheable不同的地方,被@CachePut注解的方法始终会被执行。
其结构和@Cacheable一样,如下:
@CacheEvict
@CacheEvict注解仅删除缓存,其可根据条件对缓存进行删除。
其结构如下:
@CacheEvict属性介绍
| 属性 | 类型 | 描述 |
|---|---|---|
| allEntries | boolean | 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存 |
| beforeInvocation | boolean | 是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 |
自定义缓存key
| 表达式 | 描述 |
|---|---|
| #root.args | 传递给缓存方法的参数,形式为数组 |
| #root.caches | 该方法执行时所对应的缓存,形式为数组 |
| #root.target | 目标对象 |
| #root.method | 缓存方法 |
| #root.methodName | 缓存方法的名字 |
示例:
@Cacheable(cacheNames = "users", key = "#root.methodName")
public Object getUsers() {
}
总结
| 注解 | 描述 |
|---|---|
| Cacheable | 存储及读取缓存。会先查询缓存,当缓存为空,被注解的方法才会被执行 |
| CachePut | 仅存储缓存。不查询缓存,被注解的方法始终会被执行。 |
| CacheEvict | 仅删除缓存,被注解方法会被执行 |