gpt4 book ai didi

java - Spring Redis缓存实现

转载 作者:可可西里 更新时间:2023-11-01 10:55:18 28 4
gpt4 key购买 nike

我最近在我的 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 吗?任何人都可以帮助我吗?

最佳答案

如果我理解正确的话,您希望不同的业务方法具有不同的缓存 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);
}

关于java - Spring Redis缓存实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44651071/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com