Как мы можем настроить TTL для RedisHash с помощью SpringBoot?

Я пытаюсь настроить TTL на RedisHash. Я хочу установить одинаковый срок действия для всех ключей.

1-й: Я попытался добавить аннотацию @RedisHash (value = "MyHash", timeToLive = 60) в класс сущности.

2-й: добавить новое поле в качестве истечения срока действия с помощью @TimetoLive вместе с @RedisHash (значение = "MyHash", timeToLive = 60)

@RedisHash(value = "MyHash", timeToLive = 60L)
public class MyHash {
.../attributes with few indexes
     @TimeToLive
    private Long expiration;
}

3-й: добавлен @EnableRedisRepositories с KeyspaceConfiguration

@EnableRedisRepositories(basePackageClasses = MyHash.class, keyspaceConfiguration = MyKeyspaceConfiguration.class)
public class RedisConfig {
//LettuceConnectionFactory
//RedisTemplate
}

public class MyKeyspaceConfiguration extends KeyspaceConfiguration {
    @Override
    public boolean hasSettingsFor(Class<?> type) {
        return true;
    }

    @Override
    public KeyspaceSettings getKeyspaceSettings(Class<?> type) {

        KeyspaceSettings keyspaceSettings = new KeyspaceSettings(MyHash.class, "MyHashlog");
        keyspaceSettings.setTimeToLive(60L);

        return keyspaceSettings;
    }
}

Мой репозиторий:

public interface MyHashRepository extends CrudRepository<MyHash, Long> {

    List<MyHash> findByApplicationId(String applicationId) ;
}

Все вышеперечисленные подходы не устанавливают истечения срока действия. Когда я проверяю Redis, он показывает -1.

TTL MyHash:applicationId:e1hd9-w6q0s-5jd3e-wi2h4
(integer) -1

person PwDevWorks    schedule 11.06.2020    source источник


Ответы (2)


Нашли решение: нам нужно добавить атрибут enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP, как показано ниже,

Решение 1. Использование @RedisHash для установки TTL

//Add annotation on config or Spring boot main class
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)
@SpringBootApplication
public class RedisLogServiceApplication implements WebMvcConfigurer {

    public static void main(String[] args) {
        SpringApplication.run(RedisLogServiceApplication.class, args);
    }
}

@RedisHash(value = "MyHash", timeToLive = 60L)
public class MyHash {
.../attributes with few indexes
    @Id
    private Long id;
    @Indexed
    private String applicationId;
}

Решение 2. Используйте KeySapceConfiguration для установки TTL

//Add annotation on config or Spring boot main class
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP, keyspaceConfiguration = MyKeyspaceConfiguration.class)
@SpringBootApplication
public class RedisLogServiceApplication implements WebMvcConfigurer {

    public static void main(String[] args) {
        SpringApplication.run(RedisLogServiceApplication.class, args);
    }
}

//MyKeyspaceConfiguration.class to set TTL
public class MyKeyspaceConfiguration extends KeyspaceConfiguration {
    @Override
    public boolean hasSettingsFor(Class<?> type) {
        return true;
    }

    @Override
    public KeyspaceSettings getKeyspaceSettings(Class<?> type) {

        KeyspaceSettings keyspaceSettings = new KeyspaceSettings(MyHash.class, "MyHashlog");
        keyspaceSettings.setTimeToLive(60L);

        return keyspaceSettings;
    }
}

@RedisHash(value = "MyHash")
public class MyHash {
.../attributes with few indexes
    @Id
    private Long id;
    @Indexed
    private String applicationId;
}

Без изменений в репозитории:

public interface MyHashRepository extends CrudRepository<MyHash, Long> {

    List<MyHash> findByApplicationId(String applicationId) ;
}

Также Spring создаст несколько ключей на основе атрибутов, помеченных как @Indexed в вашем классе сущности. Однако TTL применяется только к первичному ключу, то есть @Id. Например, когда я запускаю команду keys в redis-cli

>keys MyHash*
1) MyHash:id:e1hd9-w6q0s-5jd3e-wi2h4
2) MyHash:applicationId:e1hd9-w6q0s-5jd3e-wi2h4

>TTL MyHash:id:e1hd9-w6q0s-5jd3e-wi2h4
(integer) 59
>TTL MyHash:applicationId:e1hd9-w6q0s-5jd3e-wi2h4
(integer) -1

//After Expiry:
>keys MyHash*
(no keys)
>TTL MyHash:id:e1hd9-w6q0s-5jd3e-wi2h4
(integer) -2
person PwDevWorks    schedule 30.06.2020

Я смог решить это двумя способами:

Решение 1. Добавление @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600) в мой класс конфигурации

@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3000)
open class RedisConfig{}

Решение 2. Расширение класса RedisHttpSessionConfiguration и вызов setMaxInactiveIntervalInSeconds

@Configuration
open class RedisConfig: RedisHttpSessionConfiguration() {

    @PostConstruct
    open fun afterPropertiesSet() {
        val ttlInSeconds = 3000
        this.setMaxInactiveIntervalInSeconds(ttlInSeconds)
    }

Я выбрал последнее, чтобы в конечном итоге добавить ttl в качестве значения конфигурации.

person Jennifer Kron    schedule 26.08.2020
comment
Это работает только для spring-session, но не для spring-data-redis - person Muhammad Hewedy; 27.11.2020