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

重学SpringBoot3-集成Redis(九)之共享Session

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-集成Redis(九)之共享Session

  • 1. 为什么需要 Session 共享
  • 2. Spring Session 和 Redis 的集成
    • 2.1. 引入依赖
    • 2.2. 配置 Redis 连接
    • 2.3. 注解启用 Redis 作为 Session 存储
    • 2.4. 测试 Session 共享
  • 3. Spring Boot 3 + Redis Session 共享的优势
  • 4. 总结

在分布式系统中,用户的 Session 共享是一个常见的需求。随着应用规模的增长,单一的服务器已无法满足业务需求,系统往往需要部署多台服务器组成集群。然而,集群环境中如何保证用户在不同服务器间访问时的 Session 一致性成为了一个重要问题。

在这种情况下,我们可以借助 Redis 这种分布式存储系统来实现 Session 共享。通过 Redis,我们可以将用户的 Session 数据统一存储在 Redis 中,不论用户访问的是哪一台服务器,都能保证 Session 的一致性。

本篇文章将介绍如何使用 Spring Boot 3Redis 来实现分布式环境下的 Session 共享,确保用户在多个实例之间切换时,Session 数据保持一致。

1. 为什么需要 Session 共享

当应用处于单服务器环境时,用户的 Session 是直接保存在服务器内存中的。每当用户发起请求,服务器会根据 Cookie 中的 Session ID 来读取对应的 Session 数据。但在分布式环境中,应用往往部署了多台服务器,如果 Session 数据只保存在单一服务器上,那么用户请求的服务器不同,Session 数据就可能丢失。

  • 单台服务器:用户的 Session 存储在内存中,用户的请求总是由这台服务器处理,Session 可直接使用。
  • 多台服务器:当用户第一次访问时,Session 可能存储在 A 服务器上,但下一次请求由 B 服务器处理,这时 B 服务器无法访问 A 服务器的内存,导致 Session 数据丢失。

通过 Redis,我们可以将 Session 存储在集中式的缓存系统中,不管用户请求的是哪一台服务器,都能访问同一个 Session 数据。

2. Spring Session 和 Redis 的集成

Spring 提供了 Spring Session 来解决分布式环境下的 Session 管理问题。它支持多种数据存储机制,其中最常用的就是 Redis。通过将 Session 存储在 Redis 中,所有服务器实例都能共享同一份 Session 数据,从而解决分布式环境下的 Session 不一致问题。

2.1. 引入依赖

在 Spring Boot 项目中使用 Redis 实现 Session 共享,首先需要引入相关的依赖。确保在 pom.xml 中包含以下依赖:

        <dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
  • spring-session-data-redis:用于将 Spring Session 存储在 Redis 中。
  • spring-boot-starter-data-redis:Spring Boot 连接 Redis 所需的基础依赖。

2.2. 配置 Redis 连接

接下来,我们需要在 application.yml 中配置 Redis 连接信息:

具体配置见配置类,org.springframework.boot.autoconfigure.session.RedisSessionProperties

spring:data:redis:host: localhostport: 6379            # Redis 端口password:             # 如果有密码可以在这里配置lettuce:pool:max-active: 100    # 最大并发连接数max-idle: 50       # 最大空闲连接数min-idle: 10       # 最小空闲连接数session:redis:namespace: "coderjia:session"   # 定义存储在 Redis 中的 session 数据的命名空间flush-mode: on_save             # 每次保存或更新 session 时立即将数据同步到 Redissave-mode: always               # 每次请求结束时都保存 session
  • spring.data.redis:配置 Redis 的主机、端口和连接池参数。
  • spring.session:配置 Session 相关信息。

2.3. 注解启用 Redis 作为 Session 存储

另外一种配置方式是注解方式,启用 Spring Session 的 Redis 支持,只需在启动类或配置类上加上 @EnableRedisHttpSession 注解即可:

package com.coderjia.boot310redis;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;@SpringBootApplication
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60, redisNamespace = "CoderJia:session")
public class SpringBoot310RedisApplication {public static void main(String[] args) {SpringApplication.run(SpringBoot310RedisApplication.class, args);}}

@EnableRedisHttpSession 注解会自动配置 Spring Session 使用 Redis 进行 Session 存储和管理,和手动配置冲突!!!

@EnableRedisHttpSession

2.4. 测试 Session 共享

接下来,我们可以通过一个简单的 Controller 来测试 Session 共享是否成功。

package com.coderjia.boot310redis.demos.web;import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author CoderJia* @create 2024/10/7 下午 06:17* @Description**/
@RestController
@RequestMapping("/session")
public class SessionController {@GetMapping("/set")public String setSession(HttpSession session) {session.setAttribute("user", "CoderJia");return "Session set for user: CoderJia";}@GetMapping("/get")public String getSession(HttpSession session) {return "User from session: " + session.getAttribute("user");}
}

使用说明

  1. 访问 /session/set,在 Session 中存储一个名为 user 的属性,值为 CoderJia
  2. 访问 /session/get,获取 Session 中存储的 user 属性,验证数据是否存储成功。

通过部署多个实例后,测试这些接口时,即使请求被不同的实例处理,Session 数据也能共享,确保用户数据的一致性。

Session中存储属性

Session中存储属性

Session中获取属性

Session中获取属性

Session存储结构

Session存储结构

设置缓存时间

注解上可以设置缓存的时间:

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 600)

设置缓存时间之后

3. Spring Boot 3 + Redis Session 共享的优势

通过 Redis 和 Spring Session 的结合,我们可以轻松解决分布式系统中的 Session 共享问题。相比传统的基于服务器内存的 Session 管理,Redis 作为 Session 存储具有以下优势:

  1. 横向扩展:由于 Redis 是一个分布式存储系统,它能够支持多实例共享 Session 数据,轻松解决集群环境下的 Session 一致性问题。
  2. 高性能:Redis 作为内存数据库,具有极高的读写速度,能够迅速处理大量的 Session 读写操作,确保用户体验。
  3. 持久化:Redis 支持数据持久化,即使 Redis 实例重启也能恢复 Session 数据。
  4. 弹性伸缩:通过 Redis,我们可以轻松应对应用的扩展需求,保证系统的高可用性和稳定性。

4. 总结

通过本文的介绍,我们了解了如何通过 Spring Boot 3Redis 实现分布式环境下的 Session 共享。Redis 作为 Session 的集中式存储,可以确保用户在多个服务器实例之间切换时,Session 数据保持一致,解决了分布式系统中的 Session 管理问题。

在实际项目中,Session 共享的场景非常常见,特别是在需要保证用户会话一致性和系统高可用的分布式架构中,Redis 是一个非常高效且可靠的解决方案。

下一篇文章中,我们将继续探索更多 Redis 和 Spring Boot 结合的实际应用场景,敬请期待!

相关文章:

重学SpringBoot3-集成Redis(九)之共享Session

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;九&#xff09;之共享Session 1. 为什么需要 Session 共享2. Spring Session 和 Redis 的集成2.1. 引入依赖2.2. 配置 Redis 连接…...

Linux:信号保存与处理

使用kill -l命令查看信号&#xff1a; 信号量和信号确实一点关系没有 信号是操作系统发出的进程与进程之间的通知于中断&#xff0c;是进程之间时间异步通知的一种方式 先了解同步通信&#xff1a;同步通信是一种比特同步通信技术&#xff0c;要求发收双方具有同频同相的同步…...

工具方法 - 可选的一些AI聊天机器人

1, ChatGPT OpenAI https://chatgpt.com/ 2, Microsoft Copilot Microsoft Copilot: 你的 AI 助手 Microsoft Copilot: 你的 AI 助手 3, HuggingChat Hugging Face – The AI community building the future. https://huggingface.co/ https://huggingface.co/chat/ 4,…...

YOLOv11改进策略【卷积层】| CVPR-2023 ScConv:即插即用,减少冗余计算并提升特征学习

一、本文介绍 本文记录的是利用ScConv优化YOLOv11的目标检测网络模型。深度神经网络中存在大量冗余,不仅在密集模型参数中,而且在特征图的空间和通道维度中。ScConv模块通过联合减少卷积层中空间和通道的冗余,有效地限制了特征冗余,本文利用ScConv模块改进YOLOv11,提高了…...

总结拓展十四:批次管理(2)

1、批次管理后台配置 1.1 批次管理级别配置(T-code:OMTC) ——路径&#xff1a;IMG->后勤-常规->批次管理->指定级别并激活状态管理 1.2 批次状态管理配置(T-code:OMTC) ——路径&#xff1a;IMG->后勤-常规->批次管理->指定级别并激活状态管理 批状态管…...

架构设计笔记-18-安全架构设计理论与实践

知识要点 常见的安全威胁&#xff1a; 信息泄露&#xff1a;信息被泄露或透露给某个非授权的实体。破坏信息的完整性&#xff1a;数据被非授权地进行增删、修改或破坏而受到损失。拒绝服务&#xff1a;对信息或其他资源的合法访问被无条件地阻止。攻击者向服务器发送大量垃圾…...

Python网络爬虫

随着互联网的迅猛发展&#xff0c;数据成为了新的“石油”。人们对于信息的需求日益增涨&#xff0c;尤其是在市场分析、学术研究和数据挖掘等领域。网络爬虫作为一种自动提取网络数据的技术&#xff0c;因其强大的能力而备受关注。而Python&#xff0c;凭借其简洁的语法和丰富…...

38. 外观数列

目录 一、问题描述 二、解题思路 三、代码 四、复杂度分析 一、问题描述 「外观数列」是一个数位字符串序列&#xff0c;由递归公式定义&#xff1a; countAndSay(1) "1"countAndSay(n) 是 countAndSay(n-1) 的行程长度编码。 行程长度编码&#xff08;RLE&am…...

Android中的三种数据存储方式

目录 1.文件存储 1&#xff09;内部存储 1--MODE_PRIVATE: 2--MODE_APPEND: 3--MODE_WORLD_READABLE: 4--MODE_WORLD_WRITEABLE: 5--简单使用 3&#xff09;外部存储 4&#xff09;内部读取 4&#xff09;外部读取 2.SharePreferences存储 1&#xff09;基本概念 2&#xff09…...

VS2022中Qt环境配置步骤

VS2022中Qt环境配置步骤 一、安装QT 下载QT&#xff1a;从QT官网上下载QT&#xff0c;在安装过程中&#xff0c;可以根据自己的需求选择适合的QT版本。若不确定&#xff0c;建议选择最新版本&#xff0c;这有助于提高开发效率。 二、安装Visual Studio 2022 选择组件&#…...

【前端】 常用的版本控制符号汇总

前端的版本控制符主要用于管理前端项目中依赖包的版本。它们通常在package.json文件中定义&#xff0c;帮助开发者指定所需的库和框架的版本范围。以下是一些关键概念&#xff1a; 版本控制符号详解&#xff1a; 1. 依赖管理 在前端开发中&#xff0c;依赖管理工具&#xff…...

OWASP Top 10 漏洞详解:基础知识、面试常问问题与实际应用

OWASP&#xff08;开放式Web应用程序安全项目&#xff09;是一个全球性非营利组织&#xff0c;致力于提高软件安全性。OWASP Top 10 是其发布的十大Web应用程序安全风险列表&#xff0c;广泛应用于安全领域的学习和实践。本文将详细介绍OWASP Top 10 漏洞的基础知识、面试常见问…...

实景三维赋能自然资源精细化管理创新

在自然资源管理领域&#xff0c;如何实现精细化、高效化管理一直是我们面临的挑战。随着实景三维技术的兴起&#xff0c;这一挑战迎来了新的解决方案。今天&#xff0c;我们将探讨实景三维技术如何赋能自然资源的精细化管理。 1. 实景三维技术概述 实景三维技术是一种集成了遥…...

Science Robotics 通过新材料打造FiBa软机器人 可实现四种形态进化

近几年由于材料科学的进步&#xff0c;软机器人相关技术近几年研究成果显著&#xff0c;与传统的刚性机器人相比&#xff0c;软机器人的设计灵感来源于自然界中的生物系统&#xff0c;如蠕虫、章鱼、壁虎和青蛙等。这些生物利用柔软、有弹性的材料&#xff0c;在复杂环境中展现…...

C++ 的特性可以不用在主函数中调用

写完代码,都找不到从哪里进去...

香港大学神作 LightRAG 横空出世!AI 检索生成系统革命,秒懂复杂信息,动态数据无所遁形!

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; 微信订阅号&#xff5c;搜一搜&…...

云栖实录 | 智能运维年度重磅发布及大模型实践解读

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 钟炯恩 | 阿里云智能集团运维专家 张颖莹 | 阿里云智能集团算法专家 活动&#xff1a; 2024 云栖大会 AI 可观测专场 -智能运维&#xff1a;云原生大规模集群GitOps实践 2024 …...

Vue3中防止按钮重复点击的方式

本文列两种方式&#xff0c;推荐第一种&#xff0c;经过长时间测试第二种防止的还是会漏&#xff0c;这里也列一下 ①使用定时器&#xff08;推荐&#xff09; 判断3秒钟之内方法只能执行一次 <el-button click"handleClick" type"primary" :loading…...

windows主机重新安装zabbix agent提示please clear the previous agent registration

目录 1. Zabbix Agent1.1 错误提示 2. 解决方法2.1 管理员运行cmd2.2 可以正常安装 1. Zabbix Agent 1.1 错误提示 2. 解决方法 2.1 管理员运行cmd 输入 sc.exe delete “Zabbix Agent” 或者 sc.exe delete “Zabbix Agent 2” 如果成功会出现“[SC] DeleteService SUCCES…...

一个将.Geojson文件转成shapefile和kml文件的在线页面工具

最近需要读取.geojson格式的流域边界文件。在谷歌地球桌面版和globalMapper中均无法正常读取。下面我发现的一个在线的平台可以很好实现这一功能。 GeoJSON to SHP Converter Online - MyGeodata Cloud ❤️欢迎点赞收藏❤️...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

js 设置3秒后执行

如何在JavaScript中延迟3秒执行操作 在JavaScript中&#xff0c;要设置一个操作在指定延迟后&#xff08;例如3秒&#xff09;执行&#xff0c;可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法&#xff0c;它接受两个参数&#xff1a; 要执行的函数&…...