详细说说分布式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)

优点

  • 任意节点可处理请求
  • 无单点故障

缺点

  • 网络带宽消耗大(N²问题)
  • 内存占用高(每节点存全量)
  • 集群规模受限(通常≤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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;它应具备四种关键特征。&…