将 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 .

解决方法

从阅读文档来看,我认为这是不可能的,因为使用本地缓存可能会导致所有连接到该 Redis 实例的 SCG 实例的状态不一致。

您需要定义自己的 SessionRepository 实现,该实现将尝试本地咖啡因缓存,如果未找到,则转至 Redis。作为起点,您可以复制或尝试扩展 RedisSessionRepository

那么您唯一需要注意的是,如果您有多个 SCG 实例运行如何处理另一个实例更新 redis,如果其他实例已经有本地缓存​​实例,它们将如何处理它。