Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java springredis缓存实现_Java_Spring_Caching_Redis_Ttl - Fatal编程技术网

Java springredis缓存实现

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

我最近在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());
        }

我需要为每个键设置一个默认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);
}