重学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 结合的实际应用场景,敬请期待!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/442951.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机的智能浇花系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采样DHT11温湿度传感器检测温湿度&#xff0c;通过LCD1602显示 4*4按键矩阵可以设置温度湿度阈值&#xff0c;温度大于阈值则开启水泵&#xff0c;湿度大于阈值则开启风扇…

INS淡绿色风格人像街拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 INS 淡绿色风格人像街拍通过 Lightroom 调色可以营造出清新、自然、时尚的视觉效果。这种风格以淡绿色为主色调&#xff0c;给人一种宁静、舒适的感觉。 预设信息 调色风格&#xff1a;INS风格预设适合类型&#xff1a;人像&#xff0c;街拍&#xff0c;自拍&#…

第三方软件测评机构简析:软件安全测试报告的内容和作用

随着数字化时代的到来&#xff0c;软件的安全性显得尤为重要。尤其在信息安全事件频发的今天&#xff0c;软件安全测试报告成为企业和开发者关注的焦点。软件安全测试报告是评估软件系统安全性的一种综合性文档&#xff0c;通常在软件开发生命周期中进行安全性测试后生成。 软…

UE4 材质学习笔记03(翻书(Flipbook)动画/环境混合)

一.FlipBook Animation 如果你想让游戏以每秒30帧的速度运行&#xff0c;所有内容都必须在33毫秒内渲染出来&#xff0c; 如果你想让游戏以每秒60帧的速度运行的话&#xff0c;必须在16毫秒内。 所以当一个效果需要很多细节的时候&#xff0c;往往会离线创建它&#xff0c;然…

关于PPT生成的开源大模型总结

目前需要开源的PPT生成模型&#xff0c;在这里对github上的一些模型进行筛选 搜索关键词&#xff1a;ppt generate&#xff08;more starts&#xff09; williamfzc/chat-gpt-ppt: 支持直接生成PPT支持中英文需要调用ChatGPT&#xff08;Add your token (official openai api k…

Perforce演讲回顾(上):从UE项目Project Titan,看Helix Core在大型游戏开发中的版本控制与集成使用策略

日前&#xff0c;Perforce携手合作伙伴龙智一同亮相Unreal Fest 2024上海站&#xff0c;分享Helix Core版本控制系统及其协作套件的强大功能与最新动态&#xff0c;助力游戏创意产业加速前行。 Perforce解决方案工程师Kory Luo在活动主会场&#xff0c;带来《Perforce Helix C…

dfs 判重Sequence one——hdu 2610

目录 前言 搜索算法判重 map判重 set判重 Sequence one 问题描述 输入 输出 数据范围 样例 问题分析 重构dfs参数 递减&#xff0c;不重复 去重的优化 最终代码 前言 搜索算法判重 搜索算法判重有很多种方法&#xff0c;常见的有两种&#xff0c;map判重和set判重…

linux安装mysql显示公钥尚未安装 :mysql-community-libs-8.0.39-1.el7.x86_64.rpm 的公钥尚未安装

linux安装mysql显示公钥尚未安装 mysql-community-libs-8.0.39-1.el7.x86_64.rpm 的公钥尚未安装 如题&#xff0c;当执行 yum install -y mysql-community-server 报错 解决办法 命令行执行 yum install -y mysql-community-server --nogpgcheck 也就是在原来的命令后面…

Pikachu-url重定向-不安全的url跳转

不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生"跳错对象"的问题。 url跳转比较直接的危害是: …

120页满分PPT | 企业级业务架构和IT架构规划方案

方案内容综述 方案涵盖了从战略分析到具体实施路径的内容。提出了IT架构规划的工作思路&#xff0c;包括项目启动、部门访谈、资料收集、内部数据库搜索与先进实践研究等步骤&#xff0c;旨在通过这些步骤完成现状及差距分析&#xff0c;并基于此设计未来的应用架构、数据架构…

【java】final关键字详解

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

路由:ReactRouter

概述 一个路径path对应一个组件component 当我们在浏览器中访问一个path的时候&#xff0c;path对应的组件会在页面中进行渲染。 使用 快速开始 安装依赖 npm i react-router-dom基本使用 import { createBrowserRouter, RouterProvider } from react-router-domconst ro…

《Linux从小白到高手》理论篇:一文概览常用Linux重要配置文件

List item 今天继续宅家&#xff0c;闲来无事接着写。本篇是《Linux从小白到高手》理论篇的最后一篇了。本篇集中介绍所有常用的Linux重要配置文件。 用这个命令可以查看配置文件所在的位置&#xff1a;如上图 locate "*.conf" "*.ini" "*.cfg&quo…

Meilisearch 和 Ollama 实现文本向量搜索

Meilisearch 是一个开源、快速、简洁的全文搜索引擎&#xff0c;专为构建高性能、实时的搜索功能而设计。其主要特点如下&#xff1a; 极速搜索&#xff1a;Meilisearch 使用反向索引来加速搜索查询&#xff0c;因此能够在海量数据中提供毫秒级的响应时间&#xff0c;尤其适合实…

springboot 整合 rabbitMQ(1)

目录 一、MQ概述 二、MQ的优势和劣势 三、常见的MQ产品 RabbitMQ使用步骤 第一步&#xff1a;确保rabbitmq启动并且可以访问15672 第二步&#xff1a;导入依赖 第三步&#xff1a;配置 auto自动确认 manual手工确认&#xff08;推荐使用&#xff01;可以防止消息丢失&a…

Chromium 中js navigator对象c++实现分析

一、Navigator 对象 Navigator 对象包含有关浏览器的信息。 前端测试例子&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>接口测试</title> </head> <body><div id"example&q…

布局性能优化

布局使用不当回导致卡顿、掉帧、响应慢等问题 一、布局流程 1、应用侧会根据前端UI描述创建后端的页面节点树&#xff0c;其中包含了处理UI组件属性更新、布局测算、事件处理等逻辑 2、页面节点树创建完成后&#xff0c;UI线程会对每个元素进行测算&#xff08;Measure&#…

STM32中断——外部中断

目录 一、概述 二、外部中断&#xff08;Extern Interrupt简称EXTI&#xff09; 三、实例-对射式红外传感器 1、配置中断&#xff1a; 2 、完整代码 一、概述 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件(中断源)&#xff0c;使得CPU暂停当…

linux下创建软链接失败

最近在研究isce to stamps,在走流程的过程中,看了b站上Dr.Liu的视频和David Bakert的manual,按照manual进行了参数的设置,接着执行了make_single_reference_stack_isce命令,但是一直报错,发现这个报错还是国庆出去旅游的时候,想着在酒店把这个问题解决掉,但是每天早出晚…

20241005给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12时使用iperf3测网速

20241005给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12时使用iperf3测网速 2024/10/5 14:06 对于荣品RD-RK3588-AHD开发板&#xff0c;eth1位置上的PCIE转RJ458的以太网卡是默认好用的&#xff01; PCIE TO RJ45&#xff1a;RTL8111HS 被识别成为eth0了。inet addr:192.…