分布式session的4种解决方案
分布式session的4种解决方案
1、cookie和session
cookie和session都是用来跟踪用户身份信息的会话方式。
cookie存储的数据保存在本地客户端,用户获取容易,但安全性不高,存储数据小。
session存储的数据保存在服务器,用户不易获取,安全性较高,存储数据较大。
通常情况下,服务器将用户信息通过session的方式保存在服务器,然后将sessionId返回给客户端cookie,客户端进行下次请求时,就可在cookie中带上sessionId,服务器通过sessionId,就可以在服务器内存中找到对应的session对象,获取当前用户的信息。
流程可如下所示:

2、背景介绍
传统项目中,单服务器场景,服务器的session对象保存在本地内存,浏览器的每次请求都会打到该服务器上,所以,只要session没过期,一定能够获取到session对象。
但在多服务器场景,或微服务项目中,一个工程有多个实例。浏览器的多次请求,经过nginx反向代理后,有可能就会请求到不同的服务器上。场景如下所示:

3、解决方案
3.1、session复制
session同步,让集群下的服务器进行session同步,一种传统的服务器集群session管理机制,常用于服务器不多的集群环境。
集群下,进行session同步的服务器的session数据是相同的,任何一台服务器挂掉,都不会丢失用户的session数据。
但是,session同步是通过广播的方式来异步同步session,会通过网络进行数据传输。当服务器越来越多时,session同步会占用大量带宽,并且每台服务器需要存储的session数据也越来越大,占用大量服务器内存。
所以,session同步策略一般适用于集群服务器不多的场景。
3.2、客户端存储(不推荐)
直接将session数据存储到浏览器的cookie中,浏览器在发起请求时,通过cookie将session数据发送给客户端。因为cookie不安全,易获取,所以通常用来存储一些不敏感的信息。
但是,由于cookie不安全,且每次http请求,都会携带存储在cookie中的完整用户信息,会增大网络传输开销,并且cookie有存储大小限制。所以基本上不会使用这种方式。
3.3、Hash一致性
修改nginx的负载均衡配置,设置为ip-hash策略,将客户端与服务器进行绑定,让来自同一ip的请求,全都转发到同一台服务器。
此方案配置简单,但有一台服务器挂掉之后,该服务器上的session信息将全部丢失,与该服务器绑定的客户端,必须得重新登录。并且在进行水平扩展时,会重新对客户端ip进行hash操作,部分ip会被重新映射服务器。
# 配置负载均衡服务器组名称和地址
upstream web_server {ip_hash;server 192.168.12.36;server 192.168.12.37;server 192.168.12.38;
}# nginx路由配置
server {listen 8080;server_name localhost;location / {proxy_pass http://web_server;}
}
3.4、基于Redis的分布式session(推荐)
将集群下所有服务器的session都存储到redis集群中。
直接使用Spring封装的Spring Session,引入相关依赖,使用简单,session数据保存在redis中,无缝接入,无安全隐患;且Redis也可做主从集群架构,方便管理。唯一的缺点是,服务器需要与Redis做一次网络交互,多了点网络开销。

3.4.1、引入相关依赖
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session</artifactId>
</dependency><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>
3.4.2、Java 配置
@Configuration
@EnableRedisHttpSession
public class Config {@Beanpublic LettuceConnectionFactory connectionFactory() {return new LettuceConnectionFactory(); }
}
3.4.3、Redis配置
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=123456
spring.redis.database=0
相关文章:
分布式session的4种解决方案
分布式session的4种解决方案 1、cookie和session cookie和session都是用来跟踪用户身份信息的会话方式。 cookie存储的数据保存在本地客户端,用户获取容易,但安全性不高,存储数据小。 session存储的数据保存在服务器,用户不易获取…...
SQL Server2008下载地址
SQL Server2008下载地址 https://www.microsoft.com/zh-CN/download/details.aspx?id30438 版本说明 Microsoft SQL Server 2008 R2 Express Service Pack 2 是功能丰富的 SQL Server 免费版本,是学习、开发桌面、Web 及小型服务器应用程序并为它们提供功能的理…...
MySQL函数和约束
MySQL常见函数 字符串常见函数 # concat : 字符串拼接 select concat(Hello , MySQL); # lower : 全部转小写 SELECT LOWER(Hello); # upper : 全部转大写 SELECT UPPER(hello); # lpad : 左填充 SELECT LPAD(hello,10,0); # rpad : 右填充 SELECT RPAD(hello,10,0); # trim…...
关于一个git的更新使用流程
1.第一步使用git bash 使用git bash命令来进行操作(当然我是个人比较喜欢用这种方法的) 2. 第二步:连接 3.第三步:进入 4.第四步:查看分支 5.第五步:切换分支 将本地文件更新后之后进行提交 6.第六步&am…...
vue 对后端返回字段值为null的变成空字符串
// 字段null转字符串 1.export function null2str(data) { for (let x in data) { if (data[x] null) { // 如果是null 把直接内容转为 data[x] ""; } else { if (Array.isArray(data[x])) { …...
C++,菱形继承和虚继承
一、菱形继承的基本概念 菱形继承又称为钻石继承,由公共基类派生出多个中间子类,又由多个中间子类共同派生出汇聚子类。汇聚子类会得到,中间子类从公共基类继承下来的多份成员。 菱形继承的格式: A --------公共基类/ \…...
js实现一行半文本的截取
最近遇到一个需求是要在第二行的中间截取文本,因为在后面得贴一个图标,所以这种情况用常规的css截取文本有点难处理。于是在上网查阅后发现了几个方法:第一种是用伪元素加定位,把.;11..盖在文字的上面;第二…...
计算一个区间时间差值,时间保留剩下的差值
解决目的 begin end,去除集合类的其他区间差值List<rang> r1 new ArrayList(); 得到差值package com.jowoiot.wmzs.utils.date;import com.google.common.collect.Lists; import com.google.common.collect.Range; import org.apache.commons.lang.time.Dat…...
uniapp 微信小程序添加隐私保护指引
隐私弹窗: <uni-popup ref"popup"><view class"popupWrap"><view class"popupTxt">在你使用【最美万年历】之前,请仔细阅读<text class"blueColor" click"handleOpenPrivacyContract…...
行业追踪,2023-08-30
自动复盘 2023-08-30 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...
Redis——》Redis的部署方式对分布式锁的影响
推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…...
VTK——使用包围盒切割医学图像
VTK 库 vtkDICOMImageReader:专门用于读取医学图像格式 DICOM 的类。DICOM(Digital Imaging and Communications in Medicine)是医学图像和信息的标准。 vtkImageGaussianSmooth:用于图像的高斯平滑处理,主要用于去噪…...
在工具提示中使用自绘修改字体
在上一篇文章中,我们学习了如何在应用程序中添加工具提示。在之前的例子代码中,我们通过简单地为创建的工具提示设置了目标字体,这种方法很简单,因为自始至终,我们都只创建了一个工具提示。 但是,如果在应…...
【Git管理工具】使用Docker部署GitLab服务器
【Git管理工具】使用Docker部署GitLab服务器 一、GitLab介绍1.1 GitLab简介1.2 GitLab特点二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本三、Docker CompseV2版本升级(可选)3.1 创建…...
安装kali虚拟机镜像的坑
1.0 安装虚拟机镜像成功之后,只有光标,没有界面 在VMware上安装kali linux环境时,根据提示操作完成后,开启虚拟机,屏幕黑屏,左上角有一个光标在闪,一直开不了机。 出现问题的原因,…...
【Android】TextView适配文本大小并保证中英文内容均在指定的UI 组件内部
问题 现在有一个需求,在中文环境下textView没有超过底层的组件限制,但是一切换到英文环境就超出了,这个如何解决呢?有啥例子吗? 就像这样子的。 解决 全部代码如下: <?xml version"1.0"…...
【力扣每日一题】2023.8.31 一个图中连通三元组的最小度数
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个无向图,要我们找出三个节点,这三个节点他们两两相连,这三个节点除了连接到对方的其他线…...
C语言--volatile
volatile 1、介绍 volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。 …...
技术深入解析与教程:网络安全技术探秘
第一章:引言 在当今数字化时代,网络安全已经成为了重要议题。随着各种信息和业务在网络上的传输与存储,安全问题也日益突出。本文将带您深入探讨网络安全领域中的关键技术,涵盖渗透测试、漏洞挖掘以及恶意软件分析等方面…...
Android studio 实现生成二维码和扫描二维码
效果图 build.gradle(:app)添加依赖 dependencies {implementation com.google.zxing:core:3.3.3implementation com.journeyapps:zxing-android-embedded:3.6.0implementation com.google.zxing:javase:3.0.0 }Manifests.xml <uses-permission android:name"android…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
