当前位置: 首页 > news >正文

分布式Session

我用「餐厅点餐+代码实战」帮你彻底搞懂分布式Session,看完不仅能应对面试,还能直接应用到实际开发。先记住这个核心矛盾:多服务员如何记住同一顾客的喜好


一、从生活场景理解Session的本质

传统单机场景(小餐馆)
  • 服务员:Tom(唯一服务员)
  • 工作流程
    1. 顾客首次点餐 → Tom给纸质会员卡(SessionID)
    2. Tom把顾客口味记录在自己的笔记本(服务器内存)
    3. 顾客下次出示会员卡 → Tom查笔记本提供服务
分布式场景(连锁餐厅)
  • 服务员:Tom、Jerry、Lucy(多个服务器节点)
  • 致命问题
    • 顾客第一次找Tom存了爱吃辣 → 第二次请求被分配到Jerry → Jerry一脸懵逼

二、分布式Session五大解决方案

方案1:黏性会话(Sticky Session)
  • 原理:让同一用户的请求始终路由到同一服务器
  • 实现:Nginx配置ip_hash
upstream backend {ip_hash; # 像给顾客发固定服务员工牌server 192.168.1.101:8080;server 192.168.1.102:8080;
}
  • 优点:零改造成本
  • 缺点
    • 服务器宕机 → Session丢失(相当于服务员请假,笔记本被带走)
    • 扩容缩容困难(新服务员没有历史记录)
方案2:Session复制(同步广播)
  • 原理:所有服务器实时同步Session数据
  • 实现:Tomcat配置集群
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
  • 优点:任意服务器都可响应
  • 缺点
    • 网络带宽消耗大(相当于每天让所有服务员互相抄笔记)
    • 不适合大规模集群(超过10个节点性能暴跌)
方案3:集中存储(重点掌握)
  • 原理:把Session存到独立存储服务
  • 架构
    用户 → 负载均衡 → 任意服务器 → Redis/Memcached
    
  • 代码示例(Spring Session + Redis)
    1. 添加依赖:
    <dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
    </dependency>
    
    1. 配置Redis连接:
    @EnableRedisHttpSession
    public class Config {@Beanpublic LettuceConnectionFactory connectionFactory() {return new LettuceConnectionFactory("redis-host", 6379);}
    }
    
    1. 使用Session与单机完全一致:
    @GetMapping("/login")
    public String login(HttpSession session) {session.setAttribute("user", "码农阿杜"); // 自动存到Redisreturn "登录成功";
    }
    
  • 优点
    • 服务器无状态,方便扩容
    • 数据持久化,服务器重启不丢失
  • 缺点
    • 增加网络延迟(多一次存储访问)
    • 需要维护中间件
方案4:客户端存储(JWT方案)
  • 原理:把Session数据加密后直接存Cookie
  • 代码示例
    // 生成Token
    String token = Jwts.builder().setSubject("user123").claim("role", "admin").signWith(SignatureAlgorithm.HS256, "secretKey").compact();// 验证Token
    Claims claims = Jwts.parser().setSigningKey("secretKey").parseClaimsJws(token).getBody();
    
  • 优点:彻底解决服务端存储问题
  • 缺点
    • Token无法主动失效(相当于会员卡永久有效)
    • 数据大小受Cookie限制
方案5:Session共享协议(Token+数据库)
  • 实现流程
    1. 登录成功生成token(UUID)
    2. 把token和用户数据存入数据库
    3. 每次请求携带token查询数据库
  • 代码示例
    // 生成Token
    String token = UUID.randomUUID().toString();
    redisTemplate.opsForValue().set(token, userInfo, 30, TimeUnit.MINUTES);// 拦截器验证
    String token = request.getHeader("X-Token");
    User user = redisTemplate.opsForValue().get(token);
    if(user == null) throw new AuthException();
    
  • 优点:灵活控制存储方式
  • 缺点:需要手动管理生命周期

三、方案选型决策树

是否需要服务器完全无状态?
├─ 是 → 客户端存储(JWT)
└─ 否 → 是否需要高并发?├─ 是 → 集中存储(Redis)└─ 否 → Session复制(小集群)/黏性会话(稳定集群)

四、面试高频问题

Q1:如何防止Session劫持?
  • 防御措施
    1. 使用HTTPS防止网络嗅探
    2. Cookie设置HttpOnly和Secure
    3. 定期更换SessionID(如每10分钟)
Q2:分布式Session过期时间如何设置?
  • 黄金法则
    • 基础过期时间:30分钟
    • 滑动过期:每次访问刷新有效期
    // Redis示例
    redisTemplate.expire(sessionId, 30, TimeUnit.MINUTES);
    
Q3:Spring Session的实现原理?
  • 核心机制
    1. 通过Filter替换原生HttpSession
    2. SessionRepositoryFilter包装请求/响应
    3. 实际存储委托给Redis等实现

五、生产环境最佳实践

  1. Session数据最小化:只存必要信息(如userId)
  2. 读写分离:Redis主从架构提升读取性能
  3. 降级方案:在Redis故障时自动切换本地缓存
  4. 监控预警:监控Session存储容量和延迟

一句话总结

分布式Session的本质是:把服务员们的笔记本换成中央档案室! 掌握这个本质,所有解决方案都是围绕存储位置和同步方式的设计权衡。

补充

方案3和方案5确实都涉及外部存储,但它们的核心差异在于数据管理层次和实现方式。我用餐厅工作流程对比帮你彻底分清这对「双胞胎」:


本质区别对比表

方案3:集中存储(Spring Session)方案5:Session共享协议(Token+DB)
管理层次Web容器层自动管理(对开发者透明)应用层手动管理(需要显式编码)
存储内容完整Session对象(序列化存储)自定义业务数据(如用户ID、权限等)
标识传递自动通过Cookie传递JSESSIONID手动通过Header/Param传递自定义Token
数据读写框架自动完成(如Spring Session Filter拦截读写)需要手动编写存取代码
典型应用传统Web应用迁移到分布式环境前后端分离架构/APP接口

餐厅版对比解释

假设餐厅要记录顾客的「忌口清单」:

方案3:中央档案室(Spring Session)
  1. 服务员直接说:“忌口清单存总部”
  2. 每次顾客出示会员卡 → 服务员自动联系总部查清单
  3. 优势:服务员工作方式不变,只是数据位置换了
方案5:自定义登记表(Token+DB)
  1. 服务员需要:
    • 设计新的登记表格(定义Token格式)
    • 手动打电话给总部:“把顾客A的清单给我”
    • 更新后主动回传总部:“这是顾客A的新清单”
  2. 优势:完全掌控数据格式和流程

代码级区别演示

方案3典型代码(无感知):
// 和单机Session用法完全一致
HttpSession session = request.getSession();
session.setAttribute("user", user); // 自动存入Redis
方案5典型代码(全手动):
// 登录时生成并存储
String token = UUID.randomUUID().toString();
redisTemplate.opsForValue().set(token, user.getId(), 30, TimeUnit.MINUTES);// 拦截器中验证
String token = request.getHeader("X-Token");
if(!redisTemplate.hasKey(token)) {throw new UnauthorizedException();
}
Long userId = redisTemplate.opsForValue().get(token);

如何选择?

  • 选方案3如果:

    • 已有传统Web应用需要改造
    • 想保持原有Session API写法
    • 不介意依赖Spring生态
  • 选方案5如果:

    • 全新设计的前后端分离系统
    • 需要精细控制Session数据结构
    • 追求轻量化/去框架依赖

一句话总结区别

方案3是让框架帮你搬行李的旅行社,方案5是自己打包的自助游
两者最终都到达目的地(完成分布式Session),但过程体验和自由度截然不同。

相关文章:

分布式Session

我用「餐厅点餐代码实战」帮你彻底搞懂分布式Session&#xff0c;看完不仅能应对面试&#xff0c;还能直接应用到实际开发。先记住这个核心矛盾&#xff1a;多服务员如何记住同一顾客的喜好&#xff1f; 一、从生活场景理解Session的本质 传统单机场景&#xff08;小餐馆&…...

Kotlin 运算符重载

在Kotlin中&#xff0c;常用的运算符重载函数名如下&#xff1a; 1.算术操作符&#xff1a; 加法&#xff1a;plus 减法&#xff1a;minus 乘法&#xff1a;times 除法&#xff1a;div 取模&#xff1a;rem 或 mod 整数除法&#xff1a;floorDiv 求幂&#xff1a;pow 自增&…...

OpenHarmony4.1-轻量与小型系统ubuntu开发环境

因OpenHarmony官网提供包含轻量、小型与标准系统的全量代码非常宠大&#xff0c;解包后大概需要70G以上硬盘空间&#xff0c;如要编译标准系统则需要140G以上空间。 如硬盘空间有限与只使用轻量/小型OpenHarmony系统&#xff0c;则可以下载并直接使用本人裁剪源码过的ubuntu硬盘…...

AVR 单片机硬件供电处理

摘自AVR 单片机应用笔记&#xff1a;AN2519 - AVR Microcontroller Hardware Design Considerations。 2. 供电 供电设计是任何硬件设计的关键一环&#xff0c;直接影响到系统的性能。在设计供电时&#xff0c;有两个重要的方面需要考虑&#xff1a;ESD 防护和噪声干扰。这些内…...

LeetCode 27 移除元素

LeetCode 27 - 移除元素&#xff08;Remove Element&#xff09;是一个简单但经典的双指针问题&#xff0c;主要考察数组操作的基本功。虽然问题容易&#xff0c;但掌握多种解法以及衍生的变体问题对解决更复杂的操作数组问题有帮助。 题目描述 输入&#xff1a;整数数组 nums…...

对“预训练”的理解

预训练有什么用 传统的机器学习是偏数学的&#xff0c;对数据的量不做过多要求&#xff0c;而深度学习的项目通常是有大量的数据可供使用。 在平常的任务或者项目中&#xff0c;我们可能并没有大量数据&#xff0c;只有少量数据&#xff0c;在这时我们就可以通过“借用”有大…...

论文阅读:CAN GENERATIVE LARGE LANGUAGE MODELS PERFORM ASR ERROR CORRECTION?

CAN GENERATIVE LARGE LANGUAGE MODELS PERFORM ASR ERROR CORRECTION? 生成式大语言模型能否进行自动语音识别&#xff08;ASR&#xff09;纠错&#xff1f; https://arxiv.org/pdf/2307.04172 文章目录 速览常规总结通俗版 摘要&#xff08;Abstract&#xff09;2. 引言&a…...

Stable Diffusion(SD)系列模型及关联算法深度解析

一、‌基础模型架构演进‌ SD v1.5‌ ‌核心架构‌&#xff1a;基于Latent Diffusion Model&#xff08;LDM&#xff09;&#xff0c;通过VAE将图像压缩至潜空间进行扩散训练&#xff0c;支持512x512分辨率生成&#xff0c;兼容二次元与写实风格混合创作‌12。 ‌训练数据‌&…...

FPGA开发,使用Deepseek V3还是R1(3):系统级与RTL级

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…...

logback日志输出配置范例

logback日志输出配置范例 在wutool中&#xff0c;提供了logback日志输出配置范例&#xff0c;实现日志文件大小限制、滚动覆盖策略、定时清理等功能。 关于wutool wutool是一个java代码片段收集库&#xff0c;针对特定场景提供轻量解决方案&#xff0c;只要按需选择代码片段…...

【开源免费】基于SpringBoot+Vue.JS酒店管理系统(JAVA毕业设计)

本文项目编号 T 224 &#xff0c;文末自助获取源码 \color{red}{T224&#xff0c;文末自助获取源码} T224&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

Unity中动态切换光照贴图LightProbe的方法

关键代码&#xff1a;LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图&#xff1a;lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张&#xff1a; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…...

linux(2)用户管理

文章目录 1. 切换用户2. 添加删除用户3.写改密码 1. 切换用户 # 切换用户名&#xff0c;不切换工作目录 su 用户名 # 一起切换工作目录 su - 用户名 # 退出用户 exit2. 添加删除用户 # 添加用户 sudo adduser username # 推荐sudo useradd -m -s /bin/bash 用户名-m 如果创建…...

在鸿蒙HarmonyOS手机上安装hap应用

一、下载工具 安装hap包需要用到小工具 。 二、解压到目录后&#xff0c;进入该文件夹&#xff0c;打开命令行&#xff0c;如下图 三、将下载好的hap包放入刚才解压的文件夹内&#xff08;假设hap包文件名为app.hap&#xff09; 四、连接好手机和电脑&#xff0c;手机需要打…...

MacBook Pro使用FFmpeg捕获摄像头与麦克风推流音视频

FFmpeg查看macos系统音视频设备列表 ffmpeg -f avfoundation -list_devices true -i "" 使用摄像头及麦克风同时推送音频及视频流: ffmpeg -f avfoundation -pixel_format yuyv422 -framerate 30 -i "0:1" -c:v libx264 -preset ultrafast -b:v 1000k -…...

工程化与框架系列(8)--持续集成实践

持续集成实践 &#x1f504; 持续集成&#xff08;Continuous Integration&#xff0c;简称CI&#xff09;是现代前端开发流程中的重要环节&#xff0c;它通过自动化构建、测试和部署&#xff0c;帮助团队更快速、更可靠地交付高质量代码。本文将详细介绍前端持续集成的实践方…...

Python核心技术,Django学习基础入门教程(附环境安装包)

文章目录 前言1. 环境准备1.1Python安装1.2选择Python开发环境1.3 创建虚拟环境1.4 安装 Django 2. 创建 Django 项目3. Django项目结构介绍4. 启动开发服务器5. 创建 Django 应用6. 应用结构介绍7. 编写视图函数8. 配置 URL 映射9. 运行项目并访问视图10. 数据库配置与模型创建…...

【Qt-信号与槽】connect函数的用法

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;Qt Creator &#x1f680;所属专栏&#xff1a;Qt 文章目录 1.信号和槽的概念1.1 信号的本质1.2 槽的本质1.3 补充说明2. 信号和槽的使用2.1 connect函数介绍2.2 connect函数的简单使用2.2.1 图形化方…...

计算机毕业设计SpringBoot+Vue.js景区民宿预约系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

服务流程设计和服务或端口重定向及其websocket等应用示例

服务流程设计和服务或端口重定向及其websocket等应用示例 目录 服务或端口重定向的服务设计和websocket等应用示例 一、通用请求控制流程 1.1、入口 1.2、所有GET请求首先预检控制单元 1.3、http请求会分别自动307重定向 1.4、所有请求首先执行跨源控制单元 1.5、然后…...

低成本GPU算力玩转大模型编剧:Pixel Script Temple双卡并行部署实操手册

低成本GPU算力玩转大模型编剧&#xff1a;Pixel Script Temple双卡并行部署实操手册 1. 项目概述 Pixel Script Temple是一款专为剧本创作设计的AI工具&#xff0c;基于Qwen2.5-14B-Instruct大模型深度微调而成。它最大的特点是能够在消费级GPU硬件上实现高效运行&#xff0c…...

模电设计实践之“音频功率放大器的设计” - 包含OCL主放大器设计、总电路图与框架详解、设计方...

模电设计实践之音频功率放大器的设计&#xff08;word文档&#xff09;文档有详细的参数计算过程 其主要内容是&#xff1a; 1、OCL主放大器的设计 2、总电路图、框架图以及单元电路介绍 3、设计方案论证 4、设计及电路参数计算&#xff0c;元器件选择 5、技术指标校验拆开音响…...

Phi-3-mini-4k-instruct-gguf惊艳案例:同一输入在不同温度下的创意表达多样性对比

Phi-3-mini-4k-instruct-gguf惊艳案例&#xff1a;同一输入在不同温度下的创意表达多样性对比 1. 模型简介与测试背景 Phi-3-mini-4k-instruct-gguf是微软推出的轻量级文本生成模型&#xff0c;特别适合问答、文本改写和创意写作等场景。这个模型最有趣的特点之一&#xff0c…...

掰开揉碎魔改claudecode后,我盯着 Claude Code 跑了一圈,终于看懂顶级 AI Agent是如何炼成的

开头先来一句狠的很多人以为&#xff0c;Claude Code 之所以强&#xff0c;是因为模型更聪明。但我把它运行时真正生效的 Payload 抓出来之后&#xff0c;结论反而更明确了&#xff1a;顶级 AI Agent 的差距&#xff0c;很多时候不在模型本身&#xff0c;而在它背后那套“怎么约…...

别再死记硬背分度表了!用Python+Arduino动手复现K型热电偶测温全过程

别再死记硬背分度表了&#xff01;用PythonArduino动手复现K型热电偶测温全过程 温度测量是工程实践中最基础却又最关键的环节之一。想象一下&#xff0c;当你需要监控3D打印机热床温度、测量自制咖啡烘焙机的内部环境&#xff0c;或是记录太阳能热水器的水温变化时&#xff0c…...

mbedBug:面向mbed OS的轻量级嵌入式调试纳米框架

1. mbedBug&#xff1a;面向mbed OS的轻量级嵌入式调试纳米框架1.1 设计定位与工程价值mbedBug并非通用型调试器或完整测试框架&#xff0c;而是一个专为资源受限嵌入式环境裁剪的调试纳米框架&#xff08;Debug Nanoframework&#xff09;。其核心设计哲学是“最小侵入、最大可…...

Python 3.14 JIT性能调优进入倒计时:CPython核心组已宣布v3.15将移除--enable-jit-experimental标志,现在不掌握就永久错过

第一章&#xff1a;Python 3.14 JIT编译器的演进脉络与战略意义Python 3.14 并非官方发布的正式版本——截至 2024 年&#xff0c;CPython 最新稳定版为 3.12&#xff0c;3.13 处于预发布阶段&#xff0c;而 3.14 尚未进入开发路线图。因此&#xff0c;“Python 3.14 JIT 编译器…...

OpenClaw安全防护指南:Qwen3.5-9B-AWQ-4bit执行权限管控

OpenClaw安全防护指南&#xff1a;Qwen3.5-9B-AWQ-4bit执行权限管控 1. 为什么需要安全防护&#xff1f; 当我第一次在本地部署OpenClaw对接Qwen3.5-9B-AWQ-4bit模型时&#xff0c;最让我后怕的是发现它竟然能直接删除我的工作目录。这个开源智能体框架赋予了AI像人类一样操作…...

Axios 近期安全版本

在执行 npm i 的时候最好执行指定版本&#xff1a;影响版本axios (npm) 0.30.4axios (npm) 1.14.1plain-crypto-js (npm) 4.2.1安全版本axios (npm) < 0.30.3axios (npm) < 1.14.0axios (npm) > 0.30.4axios (npm) > 1.14.1plain-crypto-js (npm) 恶意包已被 np…...

装机:WIN10家庭版升级专业版

https://ubuntu.com/download/desktop/thank-you?version24.04.4&architectureamd64&ltstrue 装机&#xff1a;WIN10家庭版升级专业版Win10、Win11不重装系统情况下怎么使用一条命令实现家庭版升级为专业版或企业版&#xff1f;https://mp.weixin.qq.com/s/bIcRu6A_cl…...