Spring Redis - @RedisHash 动态设置 timeToLive

Kum*_*mar 2 spring redis spring-data-redis spring-boot

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

我知道@RedisHash是一个接口,所有字段都是最终的,我们无法动态分配值。

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

春季启动版本: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.
}
Run Code Online (Sandbox Code Playgroud)

即使尝试过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();


    }
Run Code Online (Sandbox Code Playgroud)

小智 5

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

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
}
Run Code Online (Sandbox Code Playgroud)