首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring Boot + Redis 實現 Session 共享:分布式會話管理完整教程

     編輯:Java 相關知識

為什麼需要 Session 共享?

單體應用將 Session 存儲在 JVM 堆內存,水平擴展多實例後,用戶請求被負載均衡分發到不同實例,導致「登入狀態丟失、購物車清空」。解決方案:將 Session 外部化至 Redis,所有實例讀寫同一份數據。

技術棧版本

  • Spring Boot 2.x / 3.x
  • Spring Session Data Redis
  • Redis 5+(支援 Cluster/Sentinel)

三步接入

1. 引入依賴

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

2. 啟用 Redis HttpSession

3. 配置 Redis 連線

# application.yml
spring:
  redis:
    host: localhost
    port: 6379
    password: your_password  # 生產環境必須
    database: 0
    lettuce:
      pool:
        max-active: 20
        max-idle: 10
        min-idle: 5
  session:
    store-type: redis
    redis:
      namespace: "spring:session" # 隔離多應用
      flush-mode: on_save       # 僅屬性變更時寫入
      save-mode: on_set_attribute

驗證 Session 共享效果

啟動兩個實例(端口 8080、9090),同一瀏覽器訪問:

測試步驟與預期

  1. 訪問 localhost:8080/demo/put → 返回 {"sessionId":"abc","attr":"Hello from 8080"}
  2. 訪問 localhost:9090/demo/get → 返回 {"sessionId":"abc","attr":"Hello from 8080"} 同一 SessionId、數據共享
  3. 訪問 localhost:9090/demo/put → 更新屬性
  4. 再訪 localhost:8080/demo/get → 看到最新值 雙向同步

原理解析

  • @EnableRedisHttpSession 導入 SpringHttpSessionConfiguration,註冊 SessionRepositoryFilter;
  • Filter 攔截請求,用 RedisOperationsSessionRepository 讀寫 Redis Hash(Key: spring:session:sessions:{id});
  • Cookie SESSION 傳遞 SessionId,默認 30 分鐘滑動過期。

生產環境優化清單

常見問題排查

  1. SessionId 每次請求都變:檢查 Cookie 域名/路徑/同站策略,確保瀏覽器正確攜帶;
  2. Redis 連線超時:調大 spring.redis.timeout、啟用 Lettuce 連線池;
  3. 屬性值丟失:確認對象實現 Serializable 或配置 JSON 序列化器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
優化點配置/建議
序列化改用 GenericJackson2JsonRedisSerializer 替代 JDK 序列化,體積小、可讀、跨語言
高可用Redis Cluster / Sentinel + Lettuce MasterSlaveTopologyRefresh
Session 固定關鍵業務(支付、下單)可綁定用戶 ID 作為 Session 附加屬性,防止會話劫持
監控暴露 spring.session.redis.* 指標接入 Prometheus/Grafana
Nginx 親和性若無法全共享,可用 ip_hash 降低跨實例概率(不推薦長期依賴)