При использовании spring-boot-starter-data-redis, как установить политику выселения? LFU или LRU и т. Д.?

#spring #spring-boot #redis #spring-data-redis

#весна #spring-boot #redis #spring-data-redis

Вопрос:

Когда redis используется в качестве технологии кэширования с помощью spring boot ( <artifactId>spring-boot-starter-data-redis</artifactId> ), я вижу, что в файле можно установить несколько свойств, таких как TTL application.properties . пример:

 spring.cache.cache-names=cache1,cache2
spring.cache.redis.time-to-live=600000
  

и еще несколько фрагментов из — Приложения A. Общие свойства приложения

 spring.redis.database=0 # Database index used by the connection factory.
spring.redis.url= # Connection URL. Overrides host, port, and password. User is ignored. Example: redis://user:password@example.com:6379
spring.redis.host=localhost # Redis server host.
  

Но я не могу понять, как установить политику удаления кэша, например — Наименее часто используемый или последний раз используемый и т. Д.
Как и где я должен предоставить эту информацию о конфигурации??

Комментарии:

1. вы уже выяснили ответ? : D Мне тоже нужна эта информация, лол

2. @solujic, загляните в redis.conf. Вероятно, нет способа установить его из кода Java.

3. Это возможно, см. Мой ответ.

Ответ №1:

В документации Redis cache указано:

Директиву конфигурации можно установить с помощью файла redis.conf или позже с помощью команды CONFIG SET во время выполнения.

В документации по конфигурации Redis указано:

 maxmemory 2mb
maxmemory-policy allkeys-lru
  

Объединяя их, команда для изменения политики выселения:

 CONFIG SET maxmemory-policy allkeys-lfu
  

Использование Spring Data Redis:

При использовании нереактивного соединения Redis:

 RedisConnection conn = null;
try {
    conn = connectionFactory.getConnection();
    conn.setConfig("maxmemory-policy", "allkeys-lfu");
} finally {
    if (conn != null) {
        conn.close();
    }
}
  

При использовании реактивного соединения Redis:

 ReactiveRedisConnection conn = connectionFactory.getReactiveConnection();
        conn
                .serverCommands()
                .setConfig("maxmemory-policy", "allkeys-lfu")
                .filter(status -> status.equals("OK"))
                .doFinally(unused -> conn.close())
                .block(Duration.ofSeconds(5L));