我最近在我的Spring项目中使用以下java配置实现了Redis缓存
@Configuration
@EnableCaching
public class CacheConfig {
private @Value("${redis.host}") String redisHost;
private @Value("${redis.port}") int redisPort;
@Bean
JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setHostName(redisHost);
factory.setPort(redisPort);
factory.setUsePool(true);
return factory;
}
@Bean
public ObjectMapper objectMapper() {
return Jackson2ObjectMapperBuilder.json().serializationInclusion(JsonInclude.Include.NON_NULL) // Don’t include null values
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) //ISODate
.build();
}
@Bean
public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisJsonSerializer() {
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisJsonSerializer = new GenericJackson2JsonRedisSerializer();
return genericJackson2JsonRedisJsonSerializer;
}
@Bean
RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(jedisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
@Bean
CacheManager cacheManager() {
return new RedisCacheManager(redisTemplate());
}
我正在使用以下服务方法来缓存数据
@Cacheable(value = "supplierConfigResponse", key = "#searchId")
public SupplierConfigResponse getSupplierConfig(String searchId){
//some logic
}
我需要为每个键设置一个默认的TTL。我已经通过redisTemplate.expire(key,timeout,unit)方法来设置TTL但是这需要显式逻辑来缓存每个键而我不想要在我的业务方法中这样做。有没有其他方法可以设置默认TTL? AnyBody可以帮助我。
答案 0 :(得分:0)
如果我理解正确,您希望您的不同业务方法具有不同的缓存TTL,但不希望在您的方法中插入该逻辑。
这是方面的商标问题。请按照以下步骤操作。
为超时配置创建注释。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ConfigureTimeout {
int timeout();
}
注释您的业务方法并在那里进行超时配置。
@ConfigureTimeout(timeout = 100)
@Cacheable(value = "supplierConfigResponse", key = "#key")
public String test(String key){
//your logic
return null;
}
创建并建议设置到期时间。
@Before("execution(@abc.xyz.annotations.ConfigureTimeout * *(String, ..)) &&
@annotation(configureTimeoutAnnotation) && args(key, ..)")
public void setContext(ConfigureTimeout configureTimeoutAnnotation, String key) {
redisTemplate.expire(key, configureTimeoutAnnotation.timeout(), TimeUnit.SECONDS);
}