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

了解分布式Session

大家好,我这名CRUD工程师又来了,最近我的一个同事突然在看分布式Seesion的问题,然后我们两个也是互相讨论了一下,今天我就想着把分布式Session的知识点好好的梳理一下。

在很多系统中,用户的登录功能都是用Session去实现的,客户端填写好用户名和密码,发送一个请求,服务器收到请求之后,创建Session,然后返回当前Session对应的一个JessionId,浏览器存储在cookie中,当客户端调用其他方法给服务器发送请求的时候就会携带JessionId,服务端收到请求后,验证Session是否存在进而判断用户是否登录。

在分布式环境下,Session就会出现问题了,假如服务端部署在两个服务器A和B上

用户登录时,请求落在了服务器A上,服务器A创建了一个Session,并返回JessionId

用户获取个人信息时,请求落在了服务器B上,请求携带的JesssionId在服务器B上并不会找到对应的Session

这时候服务器B就会给客户端返回一个异常提醒(用户未登录),客户端收到返回值,用户就会发现自己又被T到登录界面了

接下来,我们就看看在分布式环境下如何实现Session的一致性

一 、客户端存储

既然分布式环境中,一个客户端的多个请求可能会落在多个服务器上,那么我们是否可以改变策略,直接将Session信息存储在客户端?
答案当然是可以的,服务器将Session信息直接存储到cookie中,这样就保证了Session的一致性,但是我们并不推荐这样去做,这样就会产生数据安全的隐患,因为将一些信息存储在cookie中,相当于就把这些信息暴露给了客户端,存在严重的安全隐患。

缺点

  • 系统安全性存在问题
  • cookie对于数据类型及数据大小有所限制

二 、Session复制

将服务器A的Session,复制到服务器B,同样将服务器B的Session也复制到服务器A,这样两台服务器的Session就一致了。像tomcat等web容器都支持Session复制的功能,在同一个局域网内,一台服务器的Session会广播给其他服务器。
在这里插入图片描述

缺点

  • 同一个网段内服务器太多,每个服务器都会去复制session,会造成服务器内存浪费。

三、Session黏性

利用Nginx服务器的反向代理,将服务器A和服务器B进行代理,然后采用ip_hash的负载策略,将客户端和服务器进行绑定,也就是说客户端A第一次访问的是服务器B,那么第二次访问也必然是服务器B,这样就不存在Session不一致的问题了。

在这里插入图片描述
缺点

  • 如果服务器A宕机了,那么客户端A和客户端B的Session就会出现丢失,并且客户端A、B的所有请求都会失败

四、session集中管理

这种方式就是将所有服务器的Session进行统一管理,可以使用redis等高性能服务器来集中管理Session,而且spring官方提供的spirng-session就是这样处理Session的一致性问题。这也是目前很多企业开发用到的比较多的一种分布式Session解决方案。

在这里插入图片描述

spring-session实战

Spring提供了处理分布式Session的解决方案——Spring SessionSpring Session提供了用于管理用户会话的API和实现。

Spring Session提供了对redismongodbmysql等常用的存储库的支持,Spring Session提供与HttpSession的透明整合,这意味着开发人员可以使用Spring Session支持的实现切换HttpSession实现。

我在网上找了一个Spring Session 实现的流程图
在这里插入图片描述
Spring Session添加了一个SessionRepositoryFilter的过滤器,用来修改包装请求和响应,包装后的请求为SessionRepositoryRequestWrapper,调用getSession()方法的时候实际上就是调用Spring Session实现了的Session

Spring Session使用非常简单,添加了相关依赖后,直接操作HttpSession就可以实现效果。

pom.xml

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><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>

yml

spring:session:# session 失效时间(分钟)timeout: 86400# session 使用redis存储  store-type: redis# redis 配置redis:# redis 端口号port: 6379# redis 服务器地址host: localhost# redis库database: 0# redis 密码password: 123456

使用session

public String test( HttpServletRequest request){HttpSession session = request.getSession();session.setAttribute("key_big_handsome","value:it is me");return session.getAttribute("key_big_handsome").toString();
}

执行了这个方法,我们看redis
在这里插入图片描述

  • 第一个用来表示Session在Redis中的过期,这个k-v不存储任何有用数据,只是表示Session过期而设置。这个key在Redis中的过期时间即为Session的过期时间间隔。
  • 第二个存储这个Session的id,是一个Set类型的Redis数据结构。这个key中的最后的1681633260000值是一个时间戳,根据这个Session过期时刻滚动至下一分钟而计算得出。
  • 第三个用来存储Session的详细信息,包括Session的过期时间间隔、最近的访问时间、attributes等等。

Spring Session中有个定时任务,每个整分钟都会查询相应的spring:session:expirations:整分钟的时间戳中的过期SessionId,然后再访问一次这个SessionId,即spring:session:sessions:expires:SessionId,以便能够让Redis及时的产生key过期事件——即Session过期事件。

相关文章:

了解分布式Session

大家好&#xff0c;我这名CRUD工程师又来了&#xff0c;最近我的一个同事突然在看分布式Seesion的问题&#xff0c;然后我们两个也是互相讨论了一下&#xff0c;今天我就想着把分布式Session的知识点好好的梳理一下。 在很多系统中&#xff0c;用户的登录功能都是用Session去实…...

仿真创新大赛—国三省一 智能鱼缸(proteus)(stm32)

⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩去年下半年参加了全国仿真创新大赛&#xff0c;也是取得了国赛三等奖&#xff0c;省赛一等奖的好成绩。 ⏩本篇文章对我们的参赛作品《智能鱼缸》做一个简介。 ⏩感…...

【ARMv8 编程】A64 数据处理指令——位域字节操作指令

有些指令将字节、半字或字扩展到寄存器大小&#xff0c;可以是 X 或 W。这些指令存在于有符号&#xff08;SXTB、SXTH、SXTW&#xff09;和无符号&#xff08;UXTB、UXTH&#xff09;变体中&#xff0c;并且是适当的位域操作指令。 这些指令的有符号和无符号变体都将字节、半字…...

ctfshow 愚人杯菜狗杯部分题目(flasksession伪造ssti)

目录 <1>愚人杯 (1) easy_signin (2) easy_ssti(无过滤ssti) (3) easy_flask(flash-session伪造) (4) easy_php(C:开头序列化数据) <2> 菜狗杯 (1) 抽老婆(flask_session伪造) (2) 一言既出&#xff0c;驷马难追(intval) (3) 传说之下&#xff08;js控制台&…...

linux拓展笔记——【补充学习知识点】

文章目录1. ./configure --prefix中的prefix详解1. ./configure --prefix中的prefix详解 源码的安装一般由3个步骤组成&#xff1a;配置(configure)、编译(make)、安装(makeinstall)。 Configure是一个可执行脚本&#xff0c;在待安装的源码路径下使用命令./configure–help输…...

为何银行各岗位之间的薪酬差别如此之大?

银行里的职位种类相对较多&#xff0c;观观整理了5个最常见的职位&#xff0c;看一下你要申请的职位薪资水平到底是怎样的&#xff1f;根据如信银行考试中心发布&#xff1a; 1、客户经理岗 客户经理分为对公客户经理和对私客户经理&#xff0c;他们的主要工作不同&#xff0…...

TensorFlow 深度学习第二版:1~5

原文&#xff1a;Deep Learning with TensorFlow Second Edition 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只…...

微前端micro-app的使用

演示效果 子应用的项目 基应用嵌入子应用效果图 目录 前言 一、微前端是什么&#xff1f; 它主要解决了两个问题&#xff1a; 二、使用步骤 1.安装依赖 2.在入口处引入 3.子应用的路由&#xff08;&#xff09; 4.分配一个路由给子应用&#xff08;重要&#xff09;&#xff0…...

【JUC】Java内存模型之JMM

【JUC】Java内存模型之JMM 文章目录【JUC】Java内存模型之JMM1. 概念2. JMM三大特性2.1 可见性2.2 原子性2.3 有序性3. 多线程对变量的读写过程4. 先行发生原则——happens-before4.1 happens-before八条规则4.1.1 次序规则4.1.2 锁定规则4.1.3 volatile变量规则4.1.4 传递规则…...

Win11快速打开便签和使用技巧分享

Win11快速打开便签和使用技巧分享。Win11系统中为用户提供了一个非常实用的系统组件&#xff0c;就是便签功能&#xff0c;使用这个功能可以帮助我们便捷的进行一些重要内容的记录。那么如何去开启开启这个程序来使用呢&#xff1f;来看看以下的详情分享吧。 详细分享&#xff…...

CSS:横向导航栏

横向导航栏&#xff08;盗版导航栏&#xff0c;B站仿写。&#xff09; 原视频链接 <html><head><title>demo</title><style>*{margin: 0;padding: 0;list-style: none;text-decoration: none;}body{display: flex;justify-content: center;a…...

视频动态库测试及心得

视频动态库测试及心得 这几天一直在弄动态库测试&#xff0c;h给的写好的动态库--预处理模块的库。视频处理项目一部分&#xff0c;需要连接实际情况测试。 需求&#xff1a; 1.把实际相机连接到&#xff0c;并读取实时数据流&#xff0c;保存到双循环链表里面; 2.测试背景建模…...

陶泓达:4.18午间欧盘黄金原油最新精准操作建议!

黄金方面&#xff1a; 黄金消息面解析&#xff1a;周一&#xff08;4月17日&#xff09;美市盘中&#xff0c;美国公布的4月纽约联储制造业指数和4月NAHB房产市场指数均超出预期&#xff0c;提振了美联储在5月继续加息的预期。数据公布之后&#xff0c;美元指数加速上扬&#x…...

环境变量相关知识

目录 目录 谢谢你的阅读&#xff0c;这是对我最大的鼓舞 先说结论&#xff1a; 开始论述&#xff1a; 让我们举个例子 相关指令 创建本地变量 创建环境变量 方法一&#xff1a; 方法二&#xff1a; 删除环境变量 子进程中也有环境变量 第一种&#xff1a; 第二种 …...

如何快速入门ChatGPT

作为一个AI模型&#xff0c;ChatGPT并不需要像人一样“学习”&#xff0c;它已经通过大量的训练数据和算法进行了预训练&#xff0c;可以回答广泛的问题。 然而&#xff0c;如果你想学习如何使用ChatGPT来进行对话或者问答&#xff0c;以下是一些建议&#xff1a; 一、了解Ch…...

Akka定时任务schedule()方法

Akka定时任务schedule()方法 文章目录Akka定时任务schedule()方法什么是Akka定时任务schedule()方法&#xff1f;如何使用Akka定时任务schedule()方法&#xff1f;如何在actor外部获取Scheduler对象为什么需要提供一个隐式的ExecutionContext对象&#xff0c;用于执行定时任务&…...

Python实现处理和分析大规模文本数据集,包括数据清洗、标注和预处理

处理和分析大规模文本数据集,包括数据清洗、标注和预处理,是自然语言处理(NLP)中非常重要的一步。Python 是一种非常流行的编程语言,拥有丰富的 NLP 库和工具,可以帮助我们完成这些任务。以下是一个简单的实现示例,包括数据清洗、标注和预处理: import re import nltk…...

灌区量测水系统

1)灌区量测水 灌区量测水是水资源管理的基础&#xff0c;是推进节水农业和水价改革的重要手段。常规在主要水闸处&#xff0c;监测闸前和闸后水位及闸门开启状态(闸位)&#xff0c;通过实时监测数据&#xff0c;计算过闸流量。要实现全灌区水资源动态配置、精准灌溉&#xff0…...

3.3 泰勒公式

学习目标&#xff1a; 复习微积分基础知识。泰勒公式是微积分的一个重要应用&#xff0c;因此在学习泰勒公式之前&#xff0c;需要复习微积分的基本概念和技能&#xff0c;包括函数的导数和微分、极限、定积分等。可以参考MIT的微积分课程进行复习和加强。 学习泰勒级数和泰勒…...

ubuntu中通过vscode编译调试ORB-SLAM3

为了在orb-slam3的基础上进行二次开发&#xff0c;这几天花了不少精力&#xff0c;终于搞懂怎么在ubuntu系统中像windows里visual studio中一样方便的打断点调试了&#xff0c;在这里把整个过程再重新梳理一下。 1 首先从安装ubuntu 22.04开始 因为是从实验室毕业先辈那里继承…...

阿里版 ChatGPT 突然上线!

转自:纯洁的微笑 其实早本月初&#xff0c;就传出过不少阿里要推出类ChatGPT的消息。 前几天率先流出的天猫精灵“鸟鸟分鸟”脱口秀版GPT&#xff0c;就是基于大模型的“压缩版”&#xff0c;已经以其惊艳表现吸引了众目光。 如今“原版大菜”上桌&#xff0c;自然一点即着&a…...

《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》

一、架构图 如下图所示&#xff1a; 二、环境信息 主机名K8S版本系统版本内核版本IP地址备注k8s-master-621.24.12Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.62master节点k8s-worker-631.24.12Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63worker节点k8s-worker-641…...

MAZDA CX-50没现车怎么办?赶紧去VR看车啊!

爱车一族往往都有过这样的经历&#xff1a;听说某家品牌出了一款心仪的新车&#xff0c;于是一直心心念念想要先睹为快。然而这时候问题就来了&#xff1a;新车从发布到量产上市往往要经历一段过程。没有现车的日子里&#xff0c;就算每天去4S店蹲守也看不到新车。那种心里痒痒…...

结构体全解,适合初学者的一条龙深度讲解(附手绘图详解)

我们知道&#xff0c;C语言是允许我们自己来创造类型的&#xff0c;这些类型就叫做——自定义类型。 自定义类型又包括结构体类型&#xff0c;联合体类型还有枚举类型。 今天的文章&#xff0c;我们就着重讲解这其中的结构体类型。 目录 结构体的声明 1.1结构的基础知识 …...

什么是SD-WAN技术?企业网络优化的利器!

现今&#xff0c;企业网络架构已成为其发展不可或缺的组成部分。针对网络性能优化方面&#xff0c;SD-WAN是一种值得深思熟虑的选择&#xff0c;在企业网络中应用SD-WAN技术能够带来多重好处。 什么是SD-WAN技术以及它是如何工作的&#xff1f; SD-WAN是软件定义的广域网&…...

JAVA练习106- 生命游戏

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、题目-生命游戏 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 4 月12日练习…...

【案例教程】基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作实践技术

【原文链接】: 基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作实践技术https://mp.weixin.qq.com/s?__bizMzU5NTkyMzcxNw&mid2247537049&idx3&sn31ef342c4808aed6fee6ac108b899a33&chksmfe6897f3c91f1ee5c4fa8e4eeea34…...

php7类型约束,严格模式

在PHP7之前&#xff0c;函数和类方法不需要声明变量类型 &#xff0c;任何数据都可以被传递和返回&#xff0c;导致几乎大部分的调用操作都要判断返回的数据类型是否合格。 为了解决这个问题&#xff0c;PHP7引入了类型声明。 目前有两类变量可以声明类型&#xff1a; 形参&a…...

2023-04-11 无向图的匹配问题

无向图的匹配问题 之所以把无向图的这个匹配问题放到最后讲是因为匹配问题借鉴了有向图中一些算法的思想 1 最大匹配和完美匹配 二分图回顾 二分图&#xff1a;把一个图中的所有顶点分成两部分&#xff0c;如果每条边的两端分别属于不同部分&#xff0c;则这个图是二分图。更多…...

国家出手管人工智能AI了

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 全球都在封杀AI&#xff0c;国家也出手了&#xff0c;人工智能AI的强监管来了!这次反应速度算是很快了。国家出手&#xff0c;AI必须管。 国家网信办拟针对生成式人工智能服务出台管理办法&#…...