【问题标题】:Spring Redis - @RedisHash set timeToLive dynamicallySpring Redis - @RedisHash 动态设置 timeToLive
【发布时间】:2019-12-04 15:10:03
【问题描述】:

我想在 RedisHash 中动态设置 timeToLive 值。即,来自属性文件。

我知道@RedisHash是一个接口,所有的字段都是final的,我们不能动态赋值。

@TimeToLive 在字段级别工作正常,但我不想创建一个字段来实现它。

Spring boot 版本:2.2.1.RELEASE

@Data
@RedisHash(value = "user", timeToLive = ? ) // what i need to do here to inject dynamically ?
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User implements Serializable {
    @Id
    private String id;
    private String name;
    private String salary;

    //@TimeToLive
    //private long timeToLive; // this is working. But i don't want it like this.
}

即使尝试使用RedisCacheManager,它也无法正常工作。请建议是否有任何替代方案。

@Configuration
@EnableConfigurationProperties(CacheConfigurationProperties.class)
public class CacheConfig extends CachingConfigurerSupport {

    private static RedisCacheConfiguration createCacheConfiguration(long timeoutInSeconds) {
        return RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(timeoutInSeconds));
    }

    @Bean
    public RedisCacheConfiguration cacheConfiguration(CacheConfigurationProperties properties) {
        return createCacheConfiguration(properties.getTimeoutSeconds());
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory, CacheConfigurationProperties properties) {
        Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();

        for (Map.Entry<String, Long> cacheNameAndTimeout : properties.getCacheExpirations().entrySet()) {
            cacheConfigurations.put(cacheNameAndTimeout.getKey(), createCacheConfiguration(cacheNameAndTimeout.getValue()));
        }

        return RedisCacheManager
                .builder(redisConnectionFactory)
                .cacheDefaults(cacheConfiguration(properties))
                .withInitialCacheConfigurations(cacheConfigurations).build();


    }

【问题讨论】:

    标签: spring spring-boot redis spring-data-redis


    【解决方案1】:

    可以定义如下类,在时间字段中定义时间

    public class Example implements Serializable {
        private static final long serialVersionUID = 1L;
    
        private Long id;
    
        @Indexed
        private String name;
    
        private String data;
    
        @TimeToLive
        private long time; --> set time to live
    }
    

    【讨论】:

      猜你喜欢
      • 2022-08-17
      • 2011-10-02
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多