詳細說說分布式Session的幾種實現方式


1. 基于客戶端存儲(Cookie-Based)

原理:將會話數據直接存儲在客戶端 Cookie 中
實現

// Spring Boot 示例
@Bean
public CookieSerializer cookieSerializer() {DefaultCookieSerializer serializer = new DefaultCookieSerializer();serializer.setCookieName("SESSION");serializer.setUseBase64Encoding(true); // Base64編碼serializer.setUseHttpOnlyCookie(true); // 防XSSserializer.setCookiePath("/");serializer.setCookieMaxAge(1800); // 30分鐘過期return serializer;
}

優點

  • 服務端完全無狀態
  • 天然支持水平擴展
  • 實現簡單

缺點

  • 單Cookie大小限制(4KB)
  • 每次請求需傳輸完整會話數據
  • 安全風險(需加密+簽名)
  • 無法存儲敏感數據

適用場景:會話數據量小(<1KB)的安全非敏感場景


2. Session 復制(Session Replication)

原理:集群節點間同步 Session 數據
實現

<!-- Tomcat server.xml 配置 -->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"><Channel className="org.apache.catalina.tribes.group.GroupChannel"><Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"/><Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"><Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/></Sender></Channel>
</Cluster>

同步方式

  • 全量復制:節點變更時廣播所有 Session
  • 增量復制:僅同步修改的 Session(如 Tomcat DeltaManager)

優點

  • 任意節點可處理請求
  • 無單點故障

缺點

  • 網絡帶寬消耗大(N2問題)
  • 內存占用高(每節點存全量)
  • 集群規模受限(通常≤8節點)

適用場景:小型集群(≤5節點)且對性能要求不高


3. 集中式存儲(Centralized Storage)

原理:會話數據集中存儲在外部存儲中

3.1 數據庫存儲
// Spring Session JDBC 配置
@EnableJdbcHttpSession
public class SessionConfig {@Beanpublic JdbcIndexedSessionRepository sessionRepository(DataSource dataSource) {return new JdbcIndexedSessionRepository(dataSource);}
}

表結構

CREATE TABLE SPRING_SESSION (PRIMARY_ID CHAR(36) PRIMARY KEY,SESSION_ID CHAR(36) NOT NULL,CREATION_TIME BIGINT NOT NULL,LAST_ACCESS_TIME BIGINT NOT NULL,MAX_INACTIVE_INTERVAL INT NOT NULL,EXPIRY_TIME BIGINT NOT NULL
);
3.2 Redis存儲(最常用
// Spring Session Redis
@EnableRedisHttpSession
public class SessionConfig {@Beanpublic LettuceConnectionFactory connectionFactory() {return new LettuceConnectionFactory("redis-cluster", 6379);}
}

Redis數據結構

Key: spring:session:sessions:<sessionId>
Type: Hash
Fields:creationTime: 1625000000000maxInactiveInterval: 1800lastAccessedTime: 1625001000000sessionAttr::user: {"id":1001,"name":"John"}

優點

  • 支持大規模集群
  • 內存讀寫性能高(Redis 10萬+ QPS)
  • 數據持久化可選
  • 自動過期清理

缺點

  • 引入外部依賴
  • 網絡延遲增加(約1-3ms)
  • 需處理緩存穿透/雪崩問題

優化技巧

// 本地二級緩存(Caffeine)
@Bean
public SessionRepositoryCustomizer<RedisIndexedSessionRepository> customize() {return repo -> repo.setDefaultMaxInactiveInterval(1800);
}

4. 粘性會話(Sticky Session)

原理:負載均衡器將同一用戶的請求固定路由到同一節點
Nginx配置

upstream backend {ip_hash; # 基于IP的粘性會話server 192.168.1.101:8080;server 192.168.1.102:8080;
}

優點

  • 實現簡單
  • 無跨節點同步開銷
  • 兼容傳統應用

缺點

  • 節點故障導致會話丟失
  • 負載不均(熱點用戶)
  • 擴容時需遷移會話

適用場景:對會話一致性要求不高的傳統應用


5. Token-Based 會話(JWT)

原理:無狀態會話,信息包含在Token中
實現

// JWT 生成
String jwt = Jwts.builder().setSubject("user123").claim("roles", "admin,user").setExpiration(new Date(System.currentTimeMillis() + 3600000)).signWith(SignatureAlgorithm.HS256, "secretKey").compact();

Token結構

Header: {"alg":"HS256","typ":"JWT"}
Payload: {"sub":"user123","roles":["admin","user"],"exp":1625005000}
Signature: HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

優點

  • 完全無狀態
  • 天然支持跨域
  • 減少數據庫查詢

缺點

  • Token無法主動失效
  • 數據量受限(URL長度限制)
  • 安全風險(Token泄露)

解決方案

  • 短有效期 + Refresh Token
  • 使用黑名單(Redis記錄失效Token)

方案選型對比

方案擴展性性能可靠性安全性實現復雜度
客戶端存儲★★★★★★★★★☆★★☆☆☆★☆☆☆☆★★☆☆☆
Session復制★★☆☆☆★★☆☆☆★★★★☆★★★★☆★★★☆☆
Redis集中存儲★★★★★★★★★☆★★★★☆★★★★☆★★★☆☆
數據庫存儲★★★★☆★★☆☆☆★★★★★★★★★☆★★★☆☆
粘性會話★★☆☆☆★★★★☆★★☆☆☆★★★☆☆★☆☆☆☆
JWT★★★★★★★★★★★★★☆☆★★★☆☆★★★★☆

最佳實踐建議

  1. 首選方案

    graph LR
    A[會話數據量] -->|<1KB| B(JWT)
    A -->|1-10KB| C(Redis集群)
    A -->|>10KB| D(數據庫+本地緩存)
    
  2. 安全加固

    • Redis啟用TLS通信
    • 設置HttpOnlySecure的Cookie
    • 定期輪換加密密鑰
    // Cookie安全設置
    DefaultCookieSerializer serializer = new DefaultCookieSerializer();
    serializer.setUseSecureCookie(true); // 僅HTTPS傳輸
    serializer.setSameSite("Strict"); // 防CSRF
    
  3. 高可用設計

    • Redis Cluster + Sentinel
    • 多級緩存(Redis + 本地Caffeine)
    // 多級緩存配置
    @Bean
    public SessionRepository<?> sessionRepository() {MapSessionRepository memoryRepo = new MapSessionRepository();RedisIndexedSessionRepository redisRepo = ...;return new DelegatingSessionRepository(memoryRepo, redisRepo);
    }
    
  4. 性能優化

    • 啟用spring.session.redis.flush-mode=immediate
    • 使用MessagePack序列化替代JSON
    spring:session:redis:flush-mode: immediate # 立即寫入namespace: "app:sessions"
    
  5. 遷移方案

    生產
    開發
    傳統單機Session
    添加Spring Session依賴
    選擇存儲后端
    Redis集群
    嵌入式H2
    配置負載均衡器
    灰度遷移流量

特殊場景處理

  1. 跨域會話

    • 使用OAuth 2.0/JWT
    • 設置SameSite=None + Secure
  2. 大Session處理

    // 分片存儲
    public class LargeSessionStrategy {public void saveFragment(String sessionId, String fragmentKey, byte[] data) {redisTemplate.opsForHash().put(sessionId, fragmentKey, data);}
    }
    
  3. 實時踢人下線

    // 發布會話失效事件
    @Autowired
    private ApplicationEventPublisher eventPublisher;public void forceLogout(String sessionId) {eventPublisher.publishEvent(new SessionDestroyedEvent(sessionId));redisTemplate.delete("spring:session:sessions:" + sessionId);
    }
    

你想要的我全都有:https://pan.q刪掉憨子uark.cn/s/75a5a07b45a2

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85420.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85420.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85420.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用mac的ollama訪問模型,為什么會出現模型胡亂輸出,然后過一會兒再訪問,就又變成正常的

例子&#xff1a;大模型推理遇到內存不足 1. 場景還原 你在Mac上用Ollama運行如下代碼&#xff08;以Python為例&#xff0c;假設Ollama有API接口&#xff09;&#xff1a; import requestsprompt "請寫一首關于夏天的詩。" response requests.post("http:…

簡說 Linux 用戶組

Linux 用戶組 的核心概念、用途和管理方法&#xff0c;盡量簡明易懂。 &#x1f31f; 什么是 Linux 用戶組&#xff1f; 在 Linux 系統中&#xff1a; &#x1f449; 用戶組&#xff08;group&#xff09; 是一組用戶的集合&#xff0c;用來方便地管理權限。 &#x1f449; 用…

S32DS上進行S32K328的時鐘配置,LPUART時鐘配置步驟詳解

1&#xff1a;S32K328的基礎信息 S32K328官網介紹 由下圖可知&#xff0c;S32K328的最大主頻為 240MHz 2&#xff1a;S32K328時鐘樹配置 2.1 system clock node 節點說明 根據《S32K3xx Reference Manual》資料說明 Table 143 各個 系統時鐘節點 的最大頻率如下所示&#…

wordpress小語種網站模板

wordpress朝鮮語模板 紫色風格的韓語wordpress主題&#xff0c;適合做韓國、朝鮮的外貿公司官方網站使用。 https://www.jianzhanpress.com/?p8486 wordpress日文模板 綠色的日語wordpress外貿主題&#xff0c;用來搭建日文外貿網站很實用。 https://www.jianzhanpress.co…

網絡:Wireshark解析https協議,firefox

文章目錄 問題瀏覽器訪問的解決方法python requests問題 現在大部分的網站已經切到https,很多站點即使開了80的端口,最終還是會返回301消息,讓客戶端轉向到https的一個地址。 所以在使用wireshark進行問題分析的時候,解析tls上層的功能,是必不可少的,但是這個安全交換的…

ollama部署開源大模型

1. 技術概述 Spring AI&#xff1a;Spring 官方推出的 AI 框架&#xff0c;簡化大模型集成&#xff08;如文本生成、問答系統&#xff09;&#xff0c;支持多種 LLM 提供商。Olama&#xff1a;開源的本地 LLM 推理引擎&#xff0c;支持量化模型部署&#xff0c;提供 REST API …

Kafka 可靠性保障:消息確認與事務機制(二)

Kafka 事務機制 1. 冪等性與事務的關系 在深入探討 Kafka 的事務機制之前&#xff0c;先來了解一下冪等性的概念。冪等性&#xff0c;簡單來說&#xff0c;就是對接口的多次調用所產生的結果和調用一次是一致的。在 Kafka 中&#xff0c;冪等性主要體現在生產者端&#xff0c…

使用 React.Children.map遍歷或修改 children

使用場景&#xff1a; 需要對子組件進行統一處理&#xff08;如添加 key、包裹額外元素、過濾特定類型等&#xff09;。 動態修改 children 的 props 或結構。 示例代碼&#xff1a;遍歷并修改 children import React from react;// 一個組件&#xff0c;給每個子項添加邊框…

智能體三階:LLM→Function Call→MCP

哈嘍&#xff0c;我是老劉 老劉是個客戶端開發者&#xff0c;目前主要是用Flutter進行開發&#xff0c;從Flutter 1.0開始到現在已經6年多了。 那為啥最近我對MCP和AI這么感興趣的呢&#xff1f; 一方面是因為作為一個在客戶端領域實戰多年的程序員&#xff0c;我覺得客戶端開發…

flutter的常規特征

前言 Flutter 是由 Google 開發的開源 UI 軟件開發工具包&#xff0c;用于構建跨平臺的高性能、美觀且一致的應用程序。 一、跨平臺開發能力 1.多平臺支持&#xff1a;Flutter 支持構建 iOS、Android、Web、Windows、macOS 和 Linux 應用&#xff0c;開發者可以使用一套代碼庫在…

【Git】代碼托管服務

博主&#xff1a;&#x1f44d;不許代碼碼上紅 歡迎&#xff1a;&#x1f40b;點贊、收藏、關注、評論。 格言&#xff1a; 大鵬一日同風起&#xff0c;扶搖直上九萬里。 文章目錄 Git代碼托管服務概述Git核心概念主流Git托管平臺Git基礎配置倉庫創建方式Git文件狀態管理常用…

Android 網絡請求的選擇邏輯(Connectivity Modules)

代碼分析 ConnectivityManager packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java 許多APN已經棄用,應用層統一用 requestNetwork() 來請求網絡。 [ConnectivityManager] example [ConnectivityManager] requestNetwork() [Connectivi…

C#建立與數據庫連接(版本問題的解決方案)踩坑總結

1.如何優雅的建立數據庫連接 今天使用這個deepseek寫代碼&#xff0c;主要就是建立數據庫的鏈接&#xff0c;包括這個建庫建表啥的都是他整得&#xff0c;我就是負責執行&#xff0c;然后解決這個里面遇到的一些問題&#xff1b; 其實我學習這個C#不過是短短的4天的時間&…

FastAPI的初步學習(Django用戶過來的)

我一直以來是Django重度用戶。它有清晰的MVC架構模式、多應用組織結構。它內置用戶認證、數據庫ORM、數據庫遷移、管理后臺、日志等功能&#xff0c;還有強大的社區支持。再搭配上Django REST framework (DRF) &#xff0c;開發起來效率極高。主打功能強大、易于使用。 曾經也…

提升IT運維效率 貝銳向日葵推出自動化企業腳本功能

在企業進行遠程IT運維管理的過程中&#xff0c;難免會涉及很多需要批量操作下發指令的場景&#xff0c;包括但不限于下列場景&#xff1a; ● ?規模設備部署與初始化、設備配置更新 ● 業務軟件安裝與系統維護&#xff0c;進行安全加固或執行問題修復命令 ● 遠程設備監控與…

最簡單的遠程桌面連接方法是什么?系統自帶內外網訪問實現

在眾多遠程桌面連接方式中&#xff0c;使用 Windows 系統自帶的遠程桌面連接功能是較為簡單的方法之一&#xff0c;無論是在局域網內還是通過公網進行遠程連接&#xff0c;都能輕松實現。 一、局域網內連接步驟 1、 開啟目標計算機遠程桌面功能&#xff1a;在目標計算機&…

JVM(2)——垃圾回收算法

本文將穿透式解析JVM垃圾回收核心算法&#xff0c;涵蓋7大基礎算法4大現代GC實現3種內存分配策略&#xff0c;通過15張動態示意圖GC日志實戰分析&#xff0c;帶您徹底掌握JVM內存自動管理機制。 一、GC核心概念體系 1.1 對象存亡判定法則 引用計數法致命缺陷&#xff1a; // …

基于Spring Boot+Vue的“暖寓”宿舍管理系統設計與實現(源碼及文檔)

基于Spring BootVue的“暖寓”宿舍管理系統設計與實現 第 1 章 緒論 1.1 論文研究主要內容 1.1.1 系統概述 1.1.2 系統介紹 1.2 國內外研究現狀 第 2 章 關鍵技術介紹 2.1 關鍵性開發技術的介紹 2.1.1 Java簡介 2.1.2 Spring Boot框架 2.2 其他相關技術 2.2.1 Vue.J…

基于Java的不固定長度字符集在指定寬度和自適應模型下圖片繪制生成實戰

目錄 前言 一、需求介紹 1、指定寬度生成 2、指定列自適應生成 二、Java生成實現 1、公共方法 2、指定寬度生成 3、指定列自適應生成 三、總結 前言 在當今數字化與信息化飛速發展的時代&#xff0c;圖像的生成與處理技術正日益成為眾多領域關注的焦點。從創意設計到數…

軟考 系統架構設計師系列知識點之雜項集萃(93)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;92&#xff09; 第169題 人工智能技術已成為當前國際科技競爭的核心技術之一&#xff0c;AI芯片是占據人工智能市場的法寶。AI芯片有別于通常處理器芯片&#xff0c;它應具備四種關鍵特征。&…