SpringSession实现分布式Session

当应用部署在多台服务器并使用Nginx进行负载均衡时,Session同步成为问题。文章介绍了如何通过将Session存储在Redis缓存中来解决这个问题,涉及SpringBoot的依赖配置、Redis服务器的Docker安装以及配置文件的设定。登录成功后,用户信息(如UUID)会存储在Redis中,确保多台服务器间Session的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据优极限的课程笔记:
分布式 Session 问题
之前的代码在我们之后一台应用系统,所有操作都在一台 Tomcat 上,没有什么问题。当我们部署多台系统,配合Nginx 的时候会出现用户登录的问题
原因:
由于 Nginx 使用默认负载均衡策略( 轮询 ),请求将会按照时间顺序逐一分发到后端应用上。
也就是说刚开始我们在 Tomcat1 登录之后,用户信息放在 Tomcat1 Session 里。过了一会,请求又被 Nginx
分发到了 Tomcat2 上,这时 Tomcat2 Session 里还没有用户信息,于是又要登录。

所以需要将我们的session存储在redis缓存里面,引入pom依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
    <!-- commons-pool2 对象池依赖 -->
    <dependency>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
     <groupId>org.springframework.session</groupId>
     <artifactId>spring-session-data-redis</artifactId>
</dependency>

application.yml文件:

spring:
 redis:
#超时时间
  timeout: 10000ms
#服务器地址
  host: 192.168.10.100
#服务器端口
  port: 6379
#数据库
  database: 0
#密码
  password: root
  lettuce:
   pool:
#最大连接数,默认8
    max-active: 1024
#最大连接阻塞等待时间,默认-1
    max-wait: 10000ms
#最大空闲连接
    max-idle: 200
 #最小空闲连接
    min-idle: 5

 

在虚拟机(云服务器)通过docker安装redis:

docker pull redis

通过docker hub拉去redis的镜像,且是最新版

docker images

查看所有镜像,如果有显示redis,这说明下载redis镜像成功的了下一步就是使用run命令创建并启动镜像,但在启动镜像之前,我们需要去官网下载redis的配置文件redis.conf文件。注意不同版本的redis配置文件内容不一样,要下载对应版本的redis配置文件,这里举例。

sudo mkdir -p /root/docker/redis/data
sudo mkdir -p /root/docker/redis/conf

然后,

sudo mkdir -p /mydata/redis/conf
sudo touch /mydata/redis/conf/redis.conf

接下来,创建配置文件

sudo vim redis.conf 

内容:

#方便学习,注释掉该行。可以使所有ip访问redis
#bind 127.0.0.1
#关闭保护模式
protected-mode no
#后台启动
daemonize yes
#添加访问认证
requirepass root

接下来,启动容器:

docker run \
-p 6379:6379 \
--name redis \
-v /docker/redis/redis.conf:/etc/redis/redis.conf \
-v /docker/redis/data:/data \
--restart=always \
-d \
redis:7.0.4 \
redis-server /etc/redis/redis.conf

名词解释: - p   宿主机端口号:虚拟机(云服务器)端口号 映射

                -- name 创建一个名字为 redis的容器

                -v /docker/redis/redis.conf:/etc/redis/redis.conf \  挂载redis.conf文件


                -v /docker/redis/data:/data \  挂载redis的持久化数据


                --restart=always \  设置redis容器随docker启动而自启动


                -d \后台运行并返回容器id


                redis:7.0.4 \


                redis-server /etc/redis/redis.conf \  指定redis在docker中的配置文件路径,后台启动redis

如果临时修改了redis.conf文件需要重新加载以下配置文件使用如下命令:

systemctl restart network && systemctl restart docker 

redis,启动!

sudo docker exec -it redis redis-cli

注意:-it后面的redis是容器名称!!

此时,我们登录springboot的项目!

登录成功! 

 接下来看看redis!!!

登陆后存的就是我们的uuid!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值