Skip to content

利用 Redis 存储 Session(Spring Session 实战)

1. 引入依赖

xml
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2. 配置

yaml
spring:
  redis:
    host: redis-cluster.internal
    port: 6379
    password: ***
  session:
    store-type: redis        # 关键开关
    timeout: 1800            # 30 分钟过期
    namespace: app:session   # key 前缀
server:
  servlet:
    session:
      cookie:
        name: APPSESSIONID   # 防止多个系统冲突

3. 代码使用(与原生 Session 完全一致)

java
@RestController
public class LoginController {
    @PostMapping("/login")
    public Object login(@RequestBody LoginDTO dto, HttpSession session) {
        User user = userService.verify(dto);
        session.setAttribute("user", user);   // 自动序列化到 Redis
        return "ok";
    }

    @GetMapping("/api/profile")
    public Object profile(HttpSession session) {
        User user = (User) session.getAttribute("user");
        return user;
    }
}

4. Redis 里长什么样

127.0.0.1:6379> keys app:session:*
1) "app:session:09c4f4b7-3d3e-4d9a-9439-7c3c3ce7b7af"

127.0.0.1:6379> type app:session:09c4f4b7...
hash

127.0.0.1:6379> hgetall app:session:09c4f4b7...
1) "sessionAttr:user"
2) "{\"@class\":\"com.xxx.User\",\"id\":1,\"name\":\"Tom\"}"

TTL 30 分钟,续期策略:每次请求自动刷新 TTL(DefaultCookieSerializer 默认实现)

5. 高阶用法

  • 自定义序列化:换成 JSON / Protobuf 减少体积
  • 并发控制@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
  • 多域共享:设置 cookie.domain=.example.com 实现 SSO

四、面试金句

“负载均衡会话一致性两条路:
粘性哈希保节点,但扩缩容会丢;
Redis 集中存 Session 才是无状态王道,加 spring-session-data-redis 一行配置即可。”