代码之家  ›  专栏  ›  技术社区  ›  yali

Redis模板没有清除缓存

  •  0
  • yali  · 技术社区  · 5 年前

    缓存仍然在24秒后,我试图在每个保存缓存上设置expire,但我希望在配置中是通用的

       @Bean
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            template.setConnectionFactory(connectionFactory);
            Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = initJackson2JsonRedisSerializer();
            RedisSerializer<String> stringSerializer = new StringRedisSerializer();
            template.setKeySerializer(stringSerializer);
            template.setHashKeySerializer(stringSerializer);
            template.setValueSerializer(jackson2JsonRedisSerializer);
            template.setHashValueSerializer(jackson2JsonRedisSerializer);
            template.setDefaultSerializer(jackson2JsonRedisSerializer);
            
            template.afterPropertiesSet();
        
            template.expire(CacheType.EDITORIAL_CACHE.name(), 24, TimeUnit.SECONDS);
            template.expire(CacheType.S3_CACHE.name(), 24, TimeUnit.SECONDS);
        
            return template;
        }
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   ch271828n    5 年前

    据javadoc报道, expire Set time to live for given key. .此外,你的 @Bean public RedisTemplate<String, Object> redisTemplate(...) 将被称为 当Spring应用程序启动时 , 只有一次 .

    因此,您编写的代码的意思是,“当spring启动时,使该密钥过期。但我不关心spring启动后的任何事情。”这与您想要做的不同——正如您所提到的“我试图在每个缓存上设置expire”。

    如果需要“每次保存缓存时设置过期”,那么在保存时更改命令如何。而不是使用 SET 在redis中,您应该使用 SETEX (见 https://redis.io/commands/setex )例如,春天的对应物是, void set(K key, V value, long timeout, TimeUnit unit) ( https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/ValueOperations.html ).