首页 文章

Spring Redis缓存实现

提问于
浏览
1

我最近在我的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? Can Anyody可以帮助我 .

1 回答

  • 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);
    }
    

相关问题