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

支持分布式部署的主流方式 - Session 持久化到 Redis

1.为什么要将 Session 存储在 Redis 中

如果我们不将 Session 存储在 MySQL 或者 Redis 中, 那么做出来的项目就只能支持单机部署, 不支持分布式部署. 因为之前我们只是将 Session 存储在当前电脑的内存里面. 当张三去登录的时候, 将 Session 信息存储在 A 服务器, 这个时候负载均衡器将张三转到 B 服务器了, 而 B 服务器里面是没有张三的登录信息的, 那么这个时候, 张三又得登录一次, 这就不太合理了.

为了解决这个问题, 我们就需要将 Session 存储在 MySQL 或者 Redis 中, 而大部分的做法几乎都是将 Session 存储在 Redis 中.

画图理解 >>

  1. 单机部署

  1. 分布式部署

分布式部署相较于单机部署的区别 :

  1. 一台服务器升级为多台服务器

好处 : 1. 提升性能. 2. 当 A 服务器挂了, 还有 B 服务器, C 服务器顶着.

假设 1 台服务器每秒能够承载的并发数是 100 的话, 那么升级为 3 台服务器之后, 服务器能够承载的并发数的理论值就提升了 3 倍, 相当于性能提升了 3 倍. 但是它也带来了相应的问题 :
1. 最早只有一台服务器的时候, 张三的 Session 信息就存储在 A 服务器里, 如果不考虑服务器重启, Session 信息过期等情况, 那么服务器就会认为张三一直处于登录状态.
2. 而多台服务器中, 张三去访问程序的时候, 就不再是固定的去访问 A 服务器了, 第二次访问的时候, 张三的请求就被分配给了 B 服务器了, 这是完全可能的.如果不配置负载均衡规则的话, 默认是轮询的负载均衡策略, 也就是第一次请求分配了 A , 下一次就分配给了 B , 这样轮着分配. 如果 Session 存储在当前电脑的内存中, A 的第一次请求, 已经将 Session 信息存储在 A 服务器了, 那么下一次访问程序时, 如果请求被分配给了 B 服务器, 而 B 服务器并没有张三的登录信息, 那么就需要重新登录一次, 这就不合理了.
  1. 将 Session 持久化到数据库 - 支持分布式部署

对于上述问题, 将 Session 持久化到数据库中, 就解决了这个问题, 轮询的是程序, 而不是数据库, 所以无论请求被分配到哪个服务器, 都是可以获取到当前用户的登录信息的.

2. 如何将 Session 存储到 Redis

2.1 添加依赖

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

2.2 修改配置

application.properties

# 告诉 spring 将 session 存储在什么介质中
spring.session.store-type=redis
# session 的过期时间
server.servlet.session.timeout=1800
# session 的存储方式 - 磁盘存储
spring.session.redis.flush-mode=on_save
# 存储 session 的文件目录 (作用域)
spring.session.redis.namespace=spring:session
spring.redis.host=43.139.1.94
spring.redis.password=
spring.redis.port=6379
spring.redis.database=2

2.3 存储和读取 Session

创建 User 类 >>

@Data
public class User implements Serializable {private int id;private String username;private String password;
}

存储和读取 Session

@RestController
public class UserController {private final String user_session_key = "session_1";/*** 存储 Session* @param session* @return*/@RequestMapping("/login")public boolean login(HttpSession session) {// .... 省去验证过程// 伪代码User user = new User();user.setId(1);user.setUsername("张三");user.setPassword("123");session.setAttribute(user_session_key, user);return true;}/*** 获取 Session* @param request* @return*/@RequestMapping("/getsess")public User getSession(HttpServletRequest request) {HttpSession session = request.getSession(false);if(session != null) {return (User) session.getAttribute(user_session_key);}return null;}
}

其实这个存储和读取 Session 的代码和以前的方式很想, 只不过将 Session 存储到 Redis 的事情都由框架帮我们做了, 我们只需要遵守约定即可.

验证程序 >> 127.0.0.1:8080/login

查看 Redis 客户端 >>

获取 Session >> 127.0.0.1:8080/getsess

此时就算我们重启服务器, 再去调用 getsess, 依然可以拿到张三的身份信息, 下来可以自己测试一下.

本篇博客就到这里了, 谢谢观看~

相关文章:

支持分布式部署的主流方式 - Session 持久化到 Redis

1.为什么要将 Session 存储在 Redis 中如果我们不将 Session 存储在 MySQL 或者 Redis 中, 那么做出来的项目就只能支持单机部署, 不支持分布式部署. 因为之前我们只是将 Session 存储在当前电脑的内存里面. 当张三去登录的时候, 将 Session 信息存储在 A 服务器, 这个时候负载…...

计算机网络|第二章 物理层|湖科大课程|从零开始的计网学习——物理层(计网入门就看这篇!)

图片来源于胡科大计算机网络课程&#xff0c;https://www.bilibili.com/video/BV1c4411d7jb?p20&vd_sourcedeb12d86dce7e419744a73045bc66364。文章非盈利商业用途&#xff0c;供博主与大家学习参考&#xff0c;如有侵权&#xff0c;请联系我删除&#xff01;2.1物理层的基…...

【微服务】RabbitMQSpringAMQP消息队列

&#x1f6a9;本文已收录至专栏&#xff1a;微服务探索之旅 &#x1f44d;希望您能有所收获 一.初识MQ (1) 引入 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;可以立即得到响应&#xff0c;但是你却不能跟多个人同时通话。 异…...

jenkins +docker+python接口自动化之docker下安装jenkins(一)

jenkins dockerpython接口自动化之docker下安装jenkins&#xff08;一&#xff09; 目录&#xff1a;导读 1、下载jenkins 2、启动jenkins 3、访问jenkins 4.浏览器直接访问http://ip/:8080 5.然后粘贴到输入框中,之后新手入门中先安装默认的插件即可&#xff0c;完成后出…...

SpringBoot——Banner介绍

一、什么是BannerBanner即横幅标语&#xff0c;我们在启动SpringBoot项目时会将Banner信息打印至控制台。我们可以输出一些图形、SpringBoot版本信息等内容。默认情况下是通过实现类SpringBootBanner输出的Banner内容&#xff0c;默认的输出内容如下。二、自定义Banner如果不想…...

【STL】综述

STL&#xff0c;一文即可知 文章目录一、STL基本知识概述容器二、序列式容器详述数组容器array向量容器vector双端队列容器deque链式容器list正向链容器forward_list二、关联式容器详述红黑树RB-Tree哈希表参考博客&#x1f60a;点此到文末惊喜↩︎ 一、STL基本知识 概述 STL…...

C++中编译的静态库与动态库

1.什么是库库是写好的现有的&#xff0c;成熟的&#xff0c;可以复用的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能每个人的代码都从零开始&#xff0c;因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式&#xff0c;可以被操作系统载…...

JS对象到原始值的转换

JS对象到原始值转换的复杂性 主要由于某些对象类型存在不止一种原始值的表示 对象到原始值转换的三种基本算法 在解释三种算法前需要了解toString valueOf这两个方法 toString 返回对象的字符串表示Array类的toString方法会将每个元素转换为字符串&#xff0c;再使用逗号作为…...

深度复盘-重启 etcd 引发的异常

作者信息&#xff1a; 唐聪、王超凡&#xff0c;腾讯云原生产品中心技术专家&#xff0c;负责腾讯云大规模 TKE 集群和 etcd 控制面稳定性、性能和成本优化工作。 王子勇&#xff0c;腾讯云专家级工程师&#xff0c; 腾讯云计算产品技术服务专家团队负责人。 概况 作为当前中国…...

2023年春招热点面试题(一)------新特性

文章目录一、Spring 6.0 新特性二、Spring Boot 3.0 新特性三、JDK 系列 新特性A.**JDK8新特性&#xff08;2014年初&#xff09;&#xff08;LTS版本&#xff09;**B. **JDK9新特性&#xff08;2017年9月&#xff09;**C.**JDK10新特性&#xff08;2018年3月&#xff09;**D.*…...

工程项目管理系统源码+spring cloud 系统管理+java 系统设置+二次开发

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…...

想要精通算法和SQL的成长之路 - 接雨水

想要精通算法和SQL的成长之路 - 接雨水前言一. 接雨水前言 想要精通算法和SQL的成长之路 - 系列导航 一. 接雨水 原题链接 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 输入&#xff1a;height [0,…...

Vue3 更高效的构建工具——Vite

文章目录前言一、Vite简介1. Vite组成2.为什么选 Vite?二、Vite的优缺点vite优点vite缺点三、使用Vite创建Vue3项目1. 创建 vite 的项目2.项目的结构前言 本文讲解了构建工具 Vite&#xff0c;目前只有vue3才可以使用Vite&#xff0c;如果本文对你有所帮助请三连支持博主。 下…...

优思学院|從《狂飙》高启强爱看的《孙子兵法》到六西格玛项目管理

近期最受人瞩目的&#xff0c;无疑是电视剧《狂飙》中出类拔萃的反派高启强。而在剧中&#xff0c;指引高启强走向顶峰的&#xff0c;正是那部著名的军事经典——《孙子兵法》。 在剧中&#xff0c;高启强在一次村庄改造项目上遇到了困难&#xff0c;但他仍保持冷静&#xff0…...

如何利用状态机编程实现启保停控制(含Stateflow模型介绍)

状态机的介绍这里不再赘述,概念也很简单没有过多的复杂理论。下面我们直接给出具体实现过程。有限自动状态机详细讲解请参看下面的文章链接: PLC面向对象编程系列之有限状态机(FSM)详解_RXXW_Dor的博客-CSDN博客_有限状态机 plc实现编写PLC控制机器动作类程序时,当分支比较…...

4. sql 语句中常用命令

1. 数据表&#xff1a; 本文中所有命令&#xff0c;测试的数据表结构如下图&#xff1a; 2. 查询语句&#xff1a; 2.1 基础查询&#xff1a;select //查询单个字段&#xff1a; select 字段名 from 表名; //查询多个字段 select 字段名1,字段名2,... from 表名; //查询所…...

第三章 Opencv图像像素操作

目录1.像素1-1.确定像素位置1-2.获取指定像素的像素值1-3.修改像素的BGR值2.用numpy模块操作像素2-1.创建图像1.创建黑白图像2.创建彩色图像3.创建随机图像2-2.拼接图像1.水平拼接hstack()方法2.垂直拼接vstack()方法1.像素 1.像素是构成数字图像的最小单位。每一幅图像都是由M…...

SpringBoot集成swagger3(CD2207)(内含教学视频+源代码)

SpringBoot集成swagger3&#xff08;CD2207&#xff09;&#xff08;内含教学视频源代码&#xff09; 教学视频源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87435564 目录SpringBoot集成swagger3&#xff08;CD2207&#xff09;&#…...

Go语言语言学习十三(反射的对象值)

在Go语言中反射不仅可以获取值的类型和种类&#xff0c;还可以获取值和更改值&#xff0c;使用reflect.ValueOf()获取和设置变量的值。 使用反射值包装任意值 Go语言通过reflect.ValueOf()获取的是值的反射值对象&#xff0c;书写格式如下 value : reflect.ValueOf(rawValue…...

【ESP 保姆级教程】玩转emqx数据集成篇② ——控制台输出动作(多用于测试环境调试功能)

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-02-10 ❤️❤️ 本篇更新记录 2023-02-10 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…...

不开刀、少痛苦!拱墅区这家公立肿瘤专科,中西医结合守护生命希望

面对肿瘤&#xff0c;你是否还在恐惧开刀创伤、担忧放化疗副作用&#xff1f;杭州市拱墅区人民中西医结合医院肿瘤一科&#xff0c;作为公立二级甲等医院重点专科&#xff0c;以 “微创消瘤、中西扶正” 为核心&#xff0c;走出一条低损伤、高疗效的抗癌新路&#xff0c;为无数…...

白炽灯非线性电阻特性在电路保护与调试中的经典应用

1. 项目概述&#xff1a;当白炽灯不再照明作为一名在电子工程领域摸爬滚打了十几年的老工程师&#xff0c;我手边的“破烂”工具箱里&#xff0c;除了常规的电阻、电容、芯片&#xff0c;还常年备着几样“非主流”玩意儿&#xff1a;几个不同瓦数的白炽灯泡。在很多人看来&…...

HolmesGPT 值不值得跟?把 AI SRE 的七强格局摊开看

CNCF Sandbox 在 2025-10 收了一个项目叫 HolmesGPT&#xff0c;定位是"开源 SRE Agent"。看着像下一个值得跟的风口——但同样进了 Sandbox 的 k8sgpt 已经 7,746 星&#xff0c;比它早一年&#xff1b;新来的 kagent 背靠 Solo.io&#xff0c;2,716 星只用了一年就…...

联想拯救者15ISK加装NVMe SSD实战:从硬件兼容到系统部署的避坑指南

1. 联想拯救者15ISK加装NVMe SSD前的准备工作 我手上这台联想拯救者15ISK已经陪伴我征战了五年多&#xff0c;最近明显感觉到系统响应变慢&#xff0c;游戏加载时间变长。经过一番排查&#xff0c;发现瓶颈主要出在机械硬盘上。于是决定给它加装一块NVMe SSD&#xff0c;让老战…...

Claude Code API封装库:Python调用与实战应用指南

1. 项目概述与核心价值最近在折腾AI编程助手的时候&#xff0c;发现了一个挺有意思的项目&#xff0c;叫lyzcodebool/claude-code-api。简单来说&#xff0c;这是一个为Claude Code&#xff08;Anthropic推出的代码生成模型&#xff09;设计的非官方API封装库。如果你用过OpenA…...

8.4.3 开始屏幕和任务栏的优化:StartAllBack 找回高效 Windows 11 使用体验

&#x1f525; 个人主页&#xff1a; 杨利杰YJlio ❄️ 个人专栏&#xff1a; 《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》 《微信助手》 《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》 &#x1f31f; 让…...

工程师的幽默密码:从二进制笑话到技术漫画创作指南

1. 项目概述&#xff1a;当硬件工程师拿起画笔作为一名在电子设计领域摸爬滚打了十几年的工程师&#xff0c;我的日常总是被Verilog代码、时序约束、PCB走线和各种数据手册所包围。电路板上的世界是精确而严肃的&#xff0c;电压、电流、时钟周期&#xff0c;一切都必须分毫不差…...

作业4:独立按键+数码管实操

文章目录 1.测试代码视频2.流水灯视频3.独立按键视频(点亮四个灯)4.独立按键视频(思考题点亮8个灯)5.数码管显示“111111”6.数码管显示“123456”7.数码管显示“11.12.13”8.数码管显示“HH8800.” 1.测试代码视频 测试2.流水灯视频 流水灯#include <reg51.h> // 包含…...

开源协作平台集成结果导向管理:公益项目数字化解决方案

1. 项目概述与核心价值如果你在非营利组织、国际发展或公益项目管理领域工作&#xff0c;那么“结果导向管理”这个词对你来说一定不陌生。它听起来很专业&#xff0c;但实际操作起来&#xff0c;往往伴随着一堆令人头疼的表格、模糊的指标和难以追踪的进展。今天我想分享一个我…...

书匠策AI写毕业论文到底靠不靠谱?我把它的功能拆成“论文通关游戏“讲给你听

各位同学好&#xff0c;我是专门教人写论文的教育博主。 最近后台私信里出现频率最高的一句话是&#xff1a;"老师&#xff0c;书匠策AI到底怎么用&#xff1f;"今天我换个讲法——不列功能清单&#xff0c;而是把写毕业论文想象成一款五关游戏&#xff0c;每一关告…...