我这边的用的maven,A工程为persist模块(entity dao service),负责和db交互读写数据,B工程是restful接口工程,引入了A,在B的启动类上加了@EnableCaching注解,B中测试@Cacheable(value = {"test"}, key="#root.methodName")注解能生效,但是在A工程中的service中的接口加@Cacheable不生效,每次都会查db不走缓存。
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Resource
private LettuceConnectionFactory lettuceConnectionFactory;
@Bean
@SuppressWarnings("unchecked")
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
RedisSerializer<Object> jsonString = new FastJsonRedisSerializer<>(Object.class);
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(jsonString);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(jsonString);
return redisTemplate;
}
/**
* 配置CacheManager
*
* @return
*/
@Bean
public CacheManager cacheManager(LettuceConnectionFactory factory) {
// 配置序列化(缓存默认有效期 5分钟)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5));
RedisCacheConfiguration redisCacheConfiguration = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
// 以锁写入的方式创建RedisCacheWriter对象
//RedisCacheWriter writer = RedisCacheWriter.lockingRedisCacheWriter(factory);
// 创建默认缓存配置对象
/* 默认配置,设置缓存有效期 1小时*/
//RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1));
/* 自定义配置test:demo 的超时时间为 5分钟*/
RedisCacheManager cacheManager = RedisCacheManager
.builder(RedisCacheWriter.lockingRedisCacheWriter(factory))
.cacheDefaults(redisCacheConfiguration)
//.withInitialCacheConfigurations(singletonMap(CacheConstant.TEST_DEMO_CACHE, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5)).disableCachingNullValues()))
.transactionAware().build();
return cacheManager;
}
}
redis配置
spring:
# 环境 dev|test|prod
profiles:
active: dev
http:
multipart:
servlet:
max-file-size: 100MB
max-request-size: 100MB
enabled: true
redis:
database: 0
# host: r-wz9ocbby3w7260l8kjpd.redis.rds.aliyuncs.com
host: localhost
port: 6379
# password: '@#Mech-van' # 密码(默认为空)
timeout: 10000 # 连接超时时长(毫秒)
lettuce:
pool:
max-active: 8 #最大连接数据库连接数,设 0 为没有限制
max-idle: 8 #最大等待连接中的数量,设 0 为没有限制
max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
min-idle: 0 #最小等待连接中的数量,设 0 为没有限制
shutdown-timeout: 100ms
cache:
redis:
cache-null-values: false
use-key-prefix: true
time-to-live: 60s
检查下pom.xml的配置
https://blog.csdn.net/weixin_38750084/article/details/83628886
根据你的描述来看,pom依赖应该没问题,B项目能生效。这里要明白缓存注解生效的本质是对你的注解类做了代理,首先确认spring扫描有没有包含A工程(B工程上的@ConponentScan(com.demo.B)改为@ConponentScan(com.demo),向上一级。既然是引入A能正常启动,那应该是扫描到了的),再看你的注解是打在接口上的,这块我没试过,我通常用在controller上的,你可以试试在serviceImpl类对应的方法上加一下试试。
确实有这个问题,引入的module不起作用.解决了吗?
已解决 bean加载顺序的问题. 在new对象创建bean时 该对象使用
@Autowired 引用其它bean 该bean所有涉及的缓存失效,包括内部引用的.