说明:工程基于spring boot,jdk1.8
缓存配置类
@Configuration
@EnableCaching //开启缓存支持
public class
RedisConfig {
@Bean
public
CacheManager cacheManager(RedisTemplate redisTemplate) {
//使用redis作为缓存实现
RedisCacheManager rcm =
new
RedisCacheManager(redisTemplate);
//设置缓存过期时间,单位s(0为永不过期)
rcm.setDefaultExpiration(
0
);
//秒
return
rcm;
}
@SuppressWarnings
(
"SpringJavaAutowiringInspection"
)
@Primary
@Bean
public
RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template =
new
StringRedisTemplate(factory);
Jackson2JsonRedisSerializer 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);
template.setKeySerializer(jackson2JsonRedisSerializer);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return
template;
}
}
//业务方法
@Cacheable
(value =
"goodList"
)
public
ResponseModel getGoodList(String serverCode, Integer agentId) {
//返回数据将被缓存到redis中
return new ResponseModel();
}
被缓存到redis中的数据模型,如下图:
不想按照spring默认生成key的规则,可以在配置类中,配置key的自定义生成规则
@Configuration
public class
RedisConfig
extends
CachingConfigurerSupport {
/**
* 生成key的规则
*
@return
*/
@Bean
public
KeyGenerator keyGenerator() {
return
(target, method, params) -> {
StringBuilder sb =
new
StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for
(Object obj : params) {
sb.append(obj.toString());
}
return
sb.toString();
};
}
@Bean
public
CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager rcm =
new
RedisCacheManager(redisTemplate);
//设置缓存过期时间
rcm.setDefaultExpiration(
0
);
//秒
return
rcm;
}
@SuppressWarnings
(
"SpringJavaAutowiringInspection"
)
@Primary
@Bean
public
RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template =
new
StringRedisTemplate(factory);
Jackson2JsonRedisSerializer 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);
template.setKeySerializer(jackson2JsonRedisSerializer);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return
template;
}
}
被缓存到redis中的数据模型,如下图:
以上只对
@Cacheable注解做了简单的演示。
下面简单介绍一下关于数据缓存相关的几个注解:
- @Cacheable 在方法执行前spring先查缓存中是否有数据,如果有直接返回,若没有将方法返回值放入缓存并返回
- @CachePut 无论怎样,都会将方法的返回值放到缓存中
- @CacheEvict 将数据从缓存中删除(在更新数据库数据的时候,可以顺便更新一下缓存)
- @Cacheing 可以通过它来组合多个注解策略在一个方法上
实现原理实际上是sping aop