Java springredis缓存实现
我最近在Spring项目中使用以下java配置实现了Redis缓存Java springredis缓存实现,java,spring,caching,redis,ttl,Java,Spring,Caching,Redis,Ttl,我最近在Spring项目中使用以下java配置实现了Redis缓存 @Configuration @EnableCaching public class CacheConfig { private @Value("${redis.host}") String redisHost; private @Value("${redis.port}") int redisPort; @Bean JedisConnec
@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());
}
我需要为每个键设置一个默认TTL。我已经使用redisTemplate.expire(key,timeout,unit)方法来设置TTL,但这需要显式逻辑来缓存每个键,我不想在我的业务方法中这样做。是否有其他方法设置默认TTL?有人能帮我吗。如果我理解正确,您希望不同的业务方法具有不同的缓存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);
}
@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);
}