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