Как минимизировать взаимодействие с Redis при использовании его в качестве кеша Spring Session?

Мы используем Spring Cloud Gateway для аутентификации OAuth2, после чего он сохраняет информацию о сеансе пользователей в Redis с настройками по умолчанию, установленными @EnableRedisWebSession и

    @Bean
    fun redisConnectionFactory(): LettuceConnectionFactory {
        return LettuceConnectionFactory("redis-cache", 6379);
    }

    @Bean
    fun authorizedClientRepository(): ServerOAuth2AuthorizedClientRepository {
        return WebSessionServerOAuth2AuthorizedClientRepository()
    }

application.yml настройки кеша:

spring:
  session:
    store-type: redis
    redis:
      save-mode: on_set_attribute
      flush-mode: on_save

Он отлично работает, хотя я вижу, что он делает запросы к Redis по каждому запросу пользователя, как будто у него вообще нет кеша в памяти. Есть ли возможность изменить это поведение (т.е. делать запросы через сеть к Redis, только если текущий сеанс пользователя не найден в кеше локальной памяти)? Может быть, я могу переопределить некоторые классы или нет другого способа сделать это, кроме как переписать всю логику кеширования? Извините за довольно широкий вопрос, но я не нашел никакой информации по этой теме в документации. Или, может быть, вы могли бы указать мне на классы в исходном коде Spring Session, где реализована эта логика, чтобы я мог выяснить, какие у меня варианты.

Я использую spring-cloud-starter-gateway 2.2.5.RELEASE, spring-session-core 2.3.1.RELEASE, spring-boot-starter-data-redis-reactive и spring-session-data-redis.


person Tom Sawer    schedule 28.12.2020    source источник


Ответы (1)


Читая документацию, я не верю, что это возможно из коробки, поскольку использование локального кеша может привести к несогласованному состоянию среди всех подключенных экземпляров SCG к этому экземпляру Redis.

Вам нужно будет определить свою собственную реализацию SessionRepository, который попробует локальный кеш кофеина, и если он не найден, вместо этого перейдите в Redis. В качестве отправной точки вы можете продублировать или попытаться расширить _ 2_.

Единственное, о чем вам нужно быть осторожным, это то, что если у вас есть несколько экземпляров SCG, работающих, как обрабатывать, если другой экземпляр обновляет redis, как другие экземпляры будут обрабатывать его, если у них уже есть локально кэшированный экземпляр.

person Welsh    schedule 29.12.2020