分布式环境下的session 共享-基于spring-session组件和Redis实现

1、问题概述

不是所有的项目都是单机模式的,当一个项目服务的局域比较广,用户体量比较大,数据量较大的时候,我们都会将项目部署到多台服务器上,这些个服务器都是分布在不同的区域,这样实现了项目的负载和并发量,但同时也引发了一些问题。如我们将登录信息放在session中,通过session中的用户信息判断用户是否登录的时候。如下图:

从下图可以看出,当用户第一次携带正确的用户名和密码到达服务器1的时候,用户信息会被存放在服务器1的内存中,当用户再次发起请求的时候,这个时候可能访问的是服务器2,这个时候服务器2无法获取存放在服务器1中的用户信息,从而引发报错,提示用户未登录。

7c2fe9a2b56b4925a851ec1b675a063e.png

这个时候我们会有很多的解决方案,本案例讲述使用spring-session+redis的解决方案。

Redis是基于内存的,数据的读写性能都非常的高。

如下图:

202c3a8ce9d74698916b651bfded89b6.png

5.2、Linux中安装Redis过程

详细博客:https://blog.csdn.net/tangshiyilang/article/details/129806747

5.3、创建工程并选择如下包信息

主要包信息:spring-data-redis+spring session包

310496a429124e43ae1f448cbaab592a.png

5.3、工程pom.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.txc</groupId>
    <artifactId>distributed-session</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>distributed-session</name>
    <description>distributed-session</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <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>

        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <builder>paketobuildpacks/builder-jammy-base:latest</builder>
                    </image>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

5.4、配置连接Redis和springsession配置信息

store-type: redis:必须要添加这条信息,告诉程序session信息要存入到redis中。

server:
  port: 8081
spring:
  data:
    redis:
      database: 0
      host: 192.168.133.145
      port: 6379
      timeout: 5000
      password: 123456
  session:
    store-type: redis
    timeout: 3600
    redis:
      namespace: logininfo

5.5、创建UserController实现登录和查看用户信息

login:用户用户登录,必须传入username参数

getUserInfo:用于获取当前用户的登录信息

@RestController
public class UserController {
    @RequestMapping("/login")
    public String login(@RequestParam String username,
                        HttpSession session){
        System.out.println("==========login=============");
        session.setAttribute("username",username);
        return "登录成功";
    }
    @RequestMapping("/getUserInfo")
    public String getUserInfo(HttpSession session){
        return "当前登录用户=>"+session.getAttribute("username");
    }
}

5.6、在启动类通过注解开启

核心注解:@EnableRedisHttpSession

@SpringBootApplication
@EnableRedisHttpSession
public class DistributedSessionApplication {
    public static void main(String[] args) {
        SpringApplication.run(DistributedSessionApplication.class, args);
    }
}

5.7、通过浏览器访问login实现登录

请求地址:http://localhost:8081/login?username=xiaochun

8655ef475b164d97a1075ad35111f072.png

5.8、登录之后查看redis中的session信息

sessionAttr:username:存放了用户登录的信息

creationTime:session:创建时间

maxInactiveInterval:最大的不活动时间

lastAccessedTime:最后的访问时间

cb4a4056a150403dae669fc15aa77773.png5.9、基于IDEA启动两个工程

我们基于idea创建两个工程,模拟分布式环境,端口分别是8081和8082端口。

用户模拟用户第一次访问进入服务器1,然后访问服务器2的时候可以直接获取访问服务器1时候的用户登录信息。

5.9.1、在idea中选中edit configurations配置项目

9d5a02f2b9164486a0378973cda791dc.png

5.9.2、选择Modify options选项

a5a6881e6c7f45bcab7a699e2985e8cd.png

5.9.3、在下拉框中选择Add VM options

 

5.9.4、在输入框中输入端口信息

ec6d72e3f35b49958be362c2f7247d5c.png

5.9.5、复制第一个启动项并修改名称和端口

1318336d82174747a66fcbcecf65b623.png

5.9.6、分别启动两个工程

1a7991a487de4c69b342321b8825bf57.png

5.9.7、通过8081号端口访问login登录接口

18290712649d42f38226d9daa13392d3.png5.9.8、通过8082号端口访问getUserInfo接口

这个时候我们发现可以直接获取到session中的信息,因为两个工程都是使用redis中的存放的session信息。

f485da65bb814d1cb6cd565d5a19f0dd.png

5.10、清空session信息

sesssion.invalidate();

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

倪海厦:教你正确煮中药,发挥最大药效

同样的一个汤剂&#xff0c;我开给你&#xff0c;你如果煮的方法不对&#xff0c;吃下去效果就没那么好。 所以&#xff0c;汤&#xff0c;取它的迅捷&#xff0c;速度很快&#xff0c;煮汤的时候还有技巧&#xff0c;你喝汤料的时候&#xff0c;你到底是喝它的气&#xff0c;…

Windows安装kafka

压缩包下载地址&#xff1a;https://www.apache.org/dyn/closer.cgi?path/kafka/3.6.1/kafka_2.13-3.6.1.tgz 启动kafka步骤 zookeeper-server-start.bat rem 闭命令提示符窗口的命令回显&#xff0c;这样在运行脚本时不会显示脚本的具体命令内容 echo offrem 命令行启动未…

原来JMeter 结果处理常见问题这么简单,可惜没早点看到!

1. 前言 工作中用 jmeter 请求一个接口对谈得上会 jmeter 的人似乎都是可以做出来的&#xff0c;但是实际难点是参数化&#xff0c;结果的断言&#xff0c;结果的汇总等。本文将针对结果过滤有效性的情况展开分析。 示例场景&#xff1a;一个接口需要对入参1000多个数据做测试…

JavaScript系列-数据类型

ES6变量类型 JavaScript编程语言中&#xff0c;变量类型分为基本变量类型和引用类型&#xff0c;两种变量类型的区别在于 基本类型变量值存放于栈中&#xff0c;引用类型变量值存放于堆中基本类型赋值给其他变量&#xff0c;是将其值复制过去引用类型赋值给其他变量&#xff…

为什么SpringBoot的jar可以直接运行

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

AI 绘画 | Stable Diffusion 艺术二维码制作

前言 这篇文章教会你如果用Stable Diffusion WEB UI制作艺术二维码,什么是艺术二维码呢?就是普通二维码和艺术图片融合后的二维码图片,如下图所示。主要原理还是使用controlNet的control_v1p_sd15_qrcode_monster模型和光影模型control_v1p_sd15_brightness。 教程 准备…

第 9 部分 — 内存增强 Transformer 网络:数学见解

一、说明 在顺序数据处理领域&#xff0c;传统的 Transformer 架构擅长处理短期依赖性&#xff0c;但在需要大量内存和长序列上下文保留的任务中表现不佳。在这篇综合博客中&#xff0c;我打算探索一种新颖的混合方法&#xff0c;将 Transformer 与显式长期记忆模块集成在一起。…

最新Redis7持久化(权威出版)

首先我们要知道什么是持久化&#xff1a;持久化是指将数据保存到磁盘上&#xff0c;以确保在Redis服务器重启时数据不会丢失。 Redis支持两种主要的持久化方式&#xff1a;RDB持久化和AOF持久化 下面让我依次给你介绍一下&#xff1a; RDB持久化 作用 这是将Redis数据保存…

049:VUE 引入jquery的方法和配置

第049个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

Module build failed : Error : Vue packages version mismatch:

Vue packages version mismatch: - vue2.7.15 (E:\Workspace_ce\erp\erp-web\node_modules\vue\dist\vue.runtime.common.js) - vue-template-compiler2.6.11 (E:\Workspace_ce\erp\erp-web\node_modules\vue-template-compiler\package.json) 【问题解决了&#xff0c;我很不…

百科词条可以删除吗?如何删除自己的百度百科?

近日&#xff0c;小马识途营销顾问接到不少客户删除自己百科词条的咨询&#xff0c;有不少人自己并没有去建立百科词条&#xff0c;但是网上已经有了&#xff0c;有的信息不正确&#xff0c;甚至有的信息是负能量的&#xff0c;对当事人自己造成一定的困扰&#xff0c;所以寻求…

JAVA8新特性之函数式编程详解

JAVA8新特性之函数式编程详解 前言一、初步了解函数式接口二、 Lambda表达式2.1 概述2.2 lambda省略规则2.3 lambda省略常见实例2.4 lambda表达式与函数式接口 三、 Stream流3.1 stream流的定义3.2 Stream流的特点3.3 Stream流的三个步骤3.4 Stream 和 Collection 集合的区别&a…

Linux权限详解

Linux权限 文章目录 Linux权限一、root账号与普通账号二、Linux权限管理三、权限权值表示方法四、文件访问权限的设置方法五、粘滞位六、权限总结 前言&#xff1a; 我们在学习Linux的时候&#xff0c;我们知道在Linux下一切皆文件&#xff0c;而不同的文件对于不同的用户有不同…

119场双周赛复盘

这周没有打比赛&#xff0c;玩老头环乐&#xff08;玩物丧志&#xff09;&#xff0c; 所以是补题了 第一题 100130找到俩个数组中的公共元素 class Solution {public int[] findIntersectionValues(int[] nums1, int[] nums2) {HashMap<Integer,Integer>map1new Has…

深度优先遍历(DFS)

时间复杂度与深搜一致&#xff1b;

解决 Xshell 无法使用 root 账户远程登录 Linux 的问题

文章目录 问题描述问题原因解决办法 笔者出问题时的运行环境&#xff1a; Red Hat Enterprise Linux 9.2 x86_64 Xshell 7 问题描述 笔者在新安装的 Red Hat Enterprise Linux 中发现一个问题。在 RHEL 安装完之后&#xff0c;无法在 Xshell 中使用 root 账户远程登录此 Lin…

ReLU(Rectified Linear Unit)和Sigmoid激活函数

ReLU&#xff08;Rectified Linear Unit&#xff09;和Sigmoid都是神经网络中常用的激活函数。 特点&#xff1a; ReLU是一种简单而有效的激活函数。它对于正数部分直接返回输入&#xff0c;对于负数部分返回零。这种非线性转换有助于网络学习更复杂的表示。ReLU在许多深度学习…

【开源】基于JAVA语言的数字化社区网格管理系统

项目编号&#xff1a; S 042 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S042&#xff0c;文末获取源码。} 项目编号&#xff1a;S042&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、开发背景四、系统展示五、核心源码5…

scala变量与变量类型

1.6 变量与类型&#xff08;重点&#xff09;1.6.1 变量推断1.6.2 多变量定义1.6.3 var和val的区别 1.6.3.1 是否可变 1.6.3.2 延迟加载 1.6 变量与类型&#xff08;重点&#xff09; val修饰的变量&#xff0c;相当于Java中final修饰的变量; // 定义常量s1&#xff0c;使用…

阿里内部教程Jmeter 性能测试常用图表、服务器资源监控

性能测试常用图表 插件安装 步骤 1&#xff1a;安装插件管理器 在 Jmeter 官网上下载插件管理器 Plugins-manager-1.3.jar将 jar 包放入到 lib\ext 目录下重启 Jmeter&#xff0c;可以在选项下看到 Plugins Manager 选项 步骤 2&#xff1a;安装指定的插件 打开 Plugins Ma…
最新文章