Spring Redis Cache Implemention



>我最近在我的 Spring 项目中实现了 Redis 缓存,具有以下 java 配置

@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(密钥、超时、单位)方法来设置 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);
}

最新更新