一、开启Redis缓存
- 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置redis缓存:注意!!配置类需要打上@EnableCaching注解
@EnableCaching
@Configuration
public class RedisConfig {
@Autowired
private NacosConfig nacosConfig;
@Bean
public Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer(){
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
return jackson2JsonRedisSerializer;
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
@Bean
public CacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory){
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(nacosConfig.getRedisCacheDurationBase()
+ new Random().nextInt(nacosConfig.getRedisCacheDurationRandom())))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer()))
;
return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config)
.transactionAware()
.build();
}
}
@Cacheable(cacheNames = "prd",key = "#code")
public List<PrdInfoEntity> getPrdList(String cpdm) {
return adjustDao.ambiguousQueryPrdList(cpdm);
}
二、缓存失效
- 一顿操作下来,通过控制台的调试日志发现每次查询还是走数据库,redis服务中也没有存到对应信息。
三、解决
- 查阅资料,主流的说法是代理的问题,调用和被调用方法写在了同一个类中,对应的解决方法是分开不同的类编写方法或者暴露代理对象(启动类上使用@EnableAspectAutoProxy(exposeProxy=trie),因为不是这个原因,并未进行实验是否有效)
- 针对我的情况(springboot集成了shiro),查阅类似的相关文章说法是shiro的自定义realm域中注入对象加载顺序有问题,需要懒加载(加@Lazy注解)
四、问题原因猜想
- 猜测是shiro的realm域对spring的代理对象产生了影响,导致被注入对象的相关切面处理失效了。