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

news2024/11/20 22:15:58

更多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: localhost
      port: 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 时立即将数据同步到 Redis
      save-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.coloradmin.cn/o/2199552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

车辆重识别(2022ACM SIGGRAPH调色板:图像到图像的扩散模型)论文阅读2024/10/09

[2] Palette: Image-to-Image Diffusion Models ( ACM SIGGRAPH 2022) 作者&#xff1a;Chitwan Saharia、William Chan、Huiwen Chang 单位&#xff1a;Google Research, Brain Team 摘要&#xff1a; 本文基于条件扩散模型开发了一个统一的图像到图像翻译框架&#xff0c;并…

无人机避障——4D毫米波雷达点云滤波去噪(四)

噪声的来源&#xff1a; 对于4D毫米波雷达的前后两帧点云数据进行去噪&#xff0c;可以采用多种方法。首先&#xff0c;需要了解点云数据的噪声来源&#xff0c;可能是由于硬件限制、环境干扰或目标本身的反射特性等因素造成的。噪声点通常包括漂移点、孤立点、冗余点和混杂点…

【通过zip方式安装mysql服务】

通过zip方式安装mysql服务 Mysql安装包下载mysql安装及环境配置1.解压缩配置环境变量初始化mysql配置安装mysql服务启动MySQL服务连接mysql修改root用户密码 Mysql安装包下载 通过访问mysql官网下载&#xff1a;mysql下载地址 mysql安装及环境配置 1.解压缩 下载完成后&am…

YOLOv10改进策略【注意力机制篇】| GAM全局注意力机制: 保留信息以增强通道与空间的相互作用

一、本文介绍 本文记录的是基于GAM注意力模块的YOLOv10目标检测改进方法研究。GAM注意力模块通过3D排列和重新设计的子模块&#xff0c;能够在通道和空间方面保留信息&#xff0c;避免了先前方法中由于信息减少和维度分离而导致的全局空间-通道交互丢失的问题。本文利用GAM改进…

『网络游戏』角色创建界面逻辑【11】

创建代码&#xff1a;CreateWnd.cs 编写脚本&#xff1a;CreateWnd.cs 绑定脚本 修改脚本&#xff1a;LoginWnd.cs 绑定事件 修改脚本&#xff1a;Constans.cs 修改脚本&#xff1a;LoginSys.cs 修改脚本&#xff1a;LoginWnd.cs 拖拽框选 运行项目 - 点击开始进入创建角色界面…

柯桥外语培训韩语学习考级韩语中TOPIK常用语法表达

-기 위해서는 -는 것이 좋다 为了......&#xff0c;......比较好 -는 것보다는 -는 것이 좋다 比起......&#xff0c;......比较好 -(으)려면 -아/어/야 한다 如果想......的话&#xff0c;得...... -왜냐하면 -기 때문이다 因为...... -그 이유는 -기 때문이다 理由是…

TinyOS 点对基站通信

文章目录 一、前言1.1 发包的BlinkToRadio的数据包格式 二、混淆基站源码分析2.1 Makefile2.2 组件连接2.3 主逻辑代码 一、前言 1.1 发包的BlinkToRadio的数据包格式 如下&#xff0c;注意&#xff1a;AM层类型(1byte)即handlerID使可以在组件中修改的。 二、混淆基站源码…

专访:青年制片人林苏楠给影视行业新人的建议

近十年&#xff0c;对影视行业抱有浓厚兴趣&#xff0c;并进入专业院校学习的年轻人越来越多。但他们中的很多人毕业后却选择了其他行业&#xff0c;或者从事影视行业几年后决定转行。这其中的缘由似乎一部分来源于年轻创作者对真实的影视市场的不了解和不适应。 我们这次采访…

GC9118S替代TMI8118的优势分析,可应用在牙刷,电子锁,医疗设备等产品中

GC9118S作为一种新型集成电路&#xff0c;逐渐被视为TMI8118的理想替代品。以下是GC9118S在多个方面的优势&#xff0c;使其能够有效替代TMI8118。 1. 低功耗设计 GC9118S在功耗方面进行了优化&#xff0c;使其在待机和工作状态下都能显著降低能耗。这对于电池供电的设备&…

SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析

文章目录 同步编程&异步编程线程池为什么要使用线程池&#xff1f;Spring自定义线程池SpringBoot轻松调用线程池总结 测试demo链接 同步编程&异步编程 在Java并发编程中&#xff0c;同步和异步是两种常见的处理方式。 同步是指多个任务按顺序执行&#xff0c;一个任务的…

虚拟机三种网络配置方式随笔

1.1桥接模式 虚拟机和物理机同时直接连接物理网络&#xff08;均作为独立主机&#xff09; 桥接模式下&#xff0c;虚拟主机与真实主要在VMnet0构成的局域网内通信&#xff0c;同时通过真实主机中的网关与外网通信。由上表可看出&#xff0c;VMnet0直接连接到真实主机的某块真…

AGI时代存内计算芯片的语音识别之旅 —— 知存科技开发板体验与感悟

目录 一、简介二、活动内容2.1 多模态时代&#xff0c;存内计算框架的应用与发展1、多模态时代计算需求2、存内计算技术3、知存科技存内产品 2.2 分布式环境下深度学习任务的高效可靠执行研究2.3 IGZO在后道单片三维集成中的机遇与挑战1、IGZO的背景2、IGZO的优势3、IGZO器件的…

OpenStack 创建自定义的QCOW2格式镜像

目录 创建kvm虚拟机 创建目录上传ISO镜像 将 CentOS 7.4 上传到 /soft 目录下 创建 kvm虚机 使用的磁盘文件 配置kvm虚拟机 修改 KVM 虚机网络配置文件 安装 cloud-init 软件包 编辑 cloud.cfg 文件 编辑 network 文件 编辑 grub 文件 关闭kvm虚拟机 创建 QCOW2 镜…

10.8 C高级-shell脚本3

1、思维导图&#xff1a; 2、练习 分支结构结合test指令完成一下编程 1>判断闰年 2>输入一个数判断是否为偶数 3>使用test指令实现等级判断 90--100A 60--89B 0-50C 其他错误 代码&#xff1a; #!/bin/bash #分支结构结合test指令完成以下编程 #1判断是否闰年 read …

工业网关设备在智能制造中的应用有哪些?天拓四方

工业网关设备是一种用于连接工业设备和物联网子系统的设备&#xff0c;它能够实现数据采集、远程监控、远程控制和数据传输等功能。基于强大的数据处理和传输能力&#xff0c;工业网关设备能够实时采集各种工业设备的运行数据&#xff0c;并将其传输到云平台或数据中心进行存储…

【java】final关键字详解

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

升级 OpenSSL 的详细步骤(解决 SSH 漏洞的前提)

目录 前言1. 准备工作1.1 安装必要的依赖1.2 下载 OpenSSL 源码 2. 解压和配置2.1 解压文件2.2 配置编译参数 3. 编译和安装3.1 编译源码3.2 安装 OpenSSL 4. 验证安装5. 解决 SSH 漏洞的必要性6. 结语 前言 在信息安全的时代&#xff0c;服务器的安全性至关重要。特别是在互联…

颠覆再临!OpenAI Canvas让AI写作与编程焕然一新

目录 在Canvas界面中&#xff0c;你可以&#xff1a;Canvas有哪些强大功能&#xff1f;写作助手的升级编程功能的提升 网友反响如何&#xff1f;[如何直接使用ChatGPT4o、o1、OpenAI Canvas](https://www.nezhasoft.cn/) &#x1f447; [ChatGPT o1网页入口在文末](https://www…

Java软件架构师结合实际项目经验总结软件架构的发展进程与原理(重点讲微服务架构怎么来的)

软件架构师结合实际项目经验总结软件架构的发展进程与原理 一、前言 笔者自己一直从事软件开发工作&#xff0c;算上大四实习1年&#xff0c;一直到今年整整12年&#xff0c;这期间有些人已经转了管理岗或者转行&#xff0c;已经完全不敲代码了&#xff01;笔者依然在一线编码…

tp5 fastadmin列表页图片批量压缩并下载

记录&#xff1a;tp5 fastadmin对列表页选中数据的多张图片进行压缩并下载。 html代码 <a href"javascript:;" class"btn btn-info btn-apple btn-disabled disabled {:$auth->check(zhuanli/zhuanli/xiazai)?:hide}" title"批量下载专利证书…