必须同时引入spring-session-data-redis和spring-boot-starter-data-redis依赖,缺一不可;需配置spring.session.store-type=redis并设置spring.session.timeout,推荐使用@enableredishttpsession无参注解配合application.yml配置,避免硬编码;注意namespace隔离与database选择以防冲突。

直接结论:不用改登录逻辑,加依赖、配 Redis、加一个注解,Session 就自动存到 Redis 里了。
依赖必须加对,spring-session-data-redis 和 spring-boot-starter-data-redis 缺一不可
只加 spring-boot-starter-data-redis 不行——它只提供 Redis 操作能力,不接管 Session;只加 spring-session-data-redis 也不行——它依赖底层 Redis 客户端。Spring Boot 2.0+ 默认用 Lettuce,所以还要显式引入连接池支持:
org.springframework.session:spring-session-data-redisorg.springframework.boot:spring-boot-starter-data-redis-
org.apache.commons:commons-pool2(否则启动报Cannot instantiate interface org.springframework.data.redis.connection.RedisConnectionFactory)
@EnableRedisHttpSession 注解的参数别硬编码,优先走配置项
这个注解控制 Session 过期时间,但它的 maxInactiveIntervalInSeconds 参数会覆盖 server.servlet.session.timeout,且一旦写死在代码里就难统一管理。推荐做法是:
- 注解保持无参:
@EnableRedisHttpSession - 在
application.yml中配:spring.session.timeout=1800(单位秒) - 注意:该配置只对 Spring Session 生效,不影响 Tomcat 原生 Session
Redis 配置里 spring.session.store-type=redis 是开关,漏了就退化成内存 Session
这个配置项是 Spring Boot 自动装配的触发条件。没写或拼错(比如写成 redis-store),@EnableRedisHttpSession 会被忽略,应用仍用本地内存存 Session,多实例下立刻失效。常见错误现象:
- 本地单实例跑正常,部署两台后登录态随机丢失
- Redis 中查不到以
spring:session:开头的 key - 日志里没有类似
Creating RedisOperationsSessionRepository的初始化记录
Session 数据实际存在 Redis 的哪个库?默认是 database 0,但可能被其他服务占用
spring.redis.database 决定 Redis DB 索引,而 spring.session.redis.namespace 决定 key 前缀(默认 spring:session)。这两个要配合看:
- 如果共用一套 Redis,不同服务用了相同
database和默认namespace,会互相覆盖 Session - 建议生产环境显式设
spring.session.redis.namespace=myapp:session - 检查是否生效:连上 Redis 执行
KEYS "myapp:session:*",应能看到 session 相关 key
最容易被忽略的是 namespace 冲突和 store-type 配置缺失——这两点不排查,其他都白配。











