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

分布式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存储的数据保存在本地客户端&#xff0c;用户获取容易&#xff0c;但安全性不高&#xff0c;存储数据小。 session存储的数据保存在服务器&#xff0c;用户不易获取…...

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 免费版本&#xff0c;是学习、开发桌面、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命令来进行操作&#xff08;当然我是个人比较喜欢用这种方法的&#xff09; 2. 第二步&#xff1a;连接 3.第三步&#xff1a;进入 4.第四步&#xff1a;查看分支 5.第五步&#xff1a;切换分支 将本地文件更新后之后进行提交 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++,菱形继承和虚继承

一、菱形继承的基本概念 菱形继承又称为钻石继承&#xff0c;由公共基类派生出多个中间子类&#xff0c;又由多个中间子类共同派生出汇聚子类。汇聚子类会得到&#xff0c;中间子类从公共基类继承下来的多份成员。 菱形继承的格式&#xff1a; A --------公共基类/ \…...

js实现一行半文本的截取

最近遇到一个需求是要在第二行的中间截取文本&#xff0c;因为在后面得贴一个图标&#xff0c;所以这种情况用常规的css截取文本有点难处理。于是在上网查阅后发现了几个方法&#xff1a;第一种是用伪元素加定位&#xff0c;把.&#xff1b;11..盖在文字的上面&#xff1b;第二…...

计算一个区间时间差值,时间保留剩下的差值

解决目的 begin end&#xff0c;去除集合类的其他区间差值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 微信小程序添加隐私保护指引

隐私弹窗&#xff1a; <uni-popup ref"popup"><view class"popupWrap"><view class"popupTxt">在你使用【最美万年历】之前&#xff0c;请仔细阅读<text class"blueColor" click"handleOpenPrivacyContract…...

行业追踪,2023-08-30

自动复盘 2023-08-30 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…...

Redis——》Redis的部署方式对分布式锁的影响

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…...

VTK——使用包围盒切割医学图像

VTK 库 vtkDICOMImageReader&#xff1a;专门用于读取医学图像格式 DICOM 的类。DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;是医学图像和信息的标准。 vtkImageGaussianSmooth&#xff1a;用于图像的高斯平滑处理&#xff0c;主要用于去噪…...

在工具提示中使用自绘修改字体

在上一篇文章中&#xff0c;我们学习了如何在应用程序中添加工具提示。在之前的例子代码中&#xff0c;我们通过简单地为创建的工具提示设置了目标字体&#xff0c;这种方法很简单&#xff0c;因为自始至终&#xff0c;我们都只创建了一个工具提示。 但是&#xff0c;如果在应…...

【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 安装虚拟机镜像成功之后&#xff0c;只有光标&#xff0c;没有界面 在VMware上安装kali linux环境时&#xff0c;根据提示操作完成后&#xff0c;开启虚拟机&#xff0c;屏幕黑屏&#xff0c;左上角有一个光标在闪&#xff0c;一直开不了机。 出现问题的原因&#xff0c;…...

【Android】TextView适配文本大小并保证中英文内容均在指定的UI 组件内部

问题 现在有一个需求&#xff0c;在中文环境下textView没有超过底层的组件限制&#xff0c;但是一切换到英文环境就超出了&#xff0c;这个如何解决呢&#xff1f;有啥例子吗&#xff1f; 就像这样子的。 解决 全部代码如下&#xff1a; <?xml version"1.0"…...

【力扣每日一题】2023.8.31 一个图中连通三元组的最小度数

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个无向图&#xff0c;要我们找出三个节点&#xff0c;这三个节点他们两两相连&#xff0c;这三个节点除了连接到对方的其他线…...

C语言--volatile

volatile 1、介绍 volatile是一个类型修饰符&#xff08;type specifier&#xff09;。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile&#xff0c;基本上会导致这样的结果&#xff1a;要么无法编写多线程程序&#xff0c;要么编译器失去大量优化的机会。 …...

技术深入解析与教程:网络安全技术探秘

第一章&#xff1a;引言 在当今数字化时代&#xff0c;网络安全已经成为了重要议题。随着各种信息和业务在网络上的传输与存储&#xff0c;安全问题也日益突出。本文将带您深入探讨网络安全领域中的关键技术&#xff0c;涵盖渗透测试、漏洞挖掘以及恶意软件分析等方面&#xf…...

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…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...