基于redisson实现tomcat集群session共享

目录

1、环境

2、修改server.xml

3、修改context.xml

4、新增redisson配置文件

5、下载并复制2个Jar包到Tomcat Lib目录中

6、 安装redis

7、配置nginx负载均衡

8、配置测试页面

9、session共享测试验证


前言:

上篇中,Tomcat session复制及session共享技术-CSDN博客

这个方法是官方推荐的一个方法,但是也有一定局限性,下面是使用redisson实现session共享方法。

1、环境

该tomcat部署方法在这篇博文中,本实验环境步骤基于Tomcat多实例配置-CSDN博客

服务ip 系统
nginx192.168.226.20rocky_linux9.4
tomcat1192.168.226.20:8080rocky_linux9.4
tomcat2192.168.226.20:8081rocky_linux9.4
tomcat3192.168.226.20:8082 rocky_linux9.4

确保防火墙、selinux关闭,时间同步。

2、修改server.xml

 在server.xml中配置,所有tomcat实例都配置,注意修改实例的路径

vim /data/application/tomcat1/conf/server.xml +40
    <Resource name="bean/redisson"auth="Container"factory="org.redisson.JndiRedissonFactory"configPath="${catalina.base}/conf/redisson.yaml"closeMethod="shutdown"/>

添加位置可看图:

3、修改context.xml

所有tomcat实例都配置,注意修改实例的路径

vim /data/application/tomcat1/conf/context.xml
    <ResourceLink name="bean/redisson"global="bean/redisson"type="org.redisson.api.RedissonClient" /><Manager className="org.redisson.tomcat.JndiRedissonSessionManager"readMode="REDIS"jndiName="bean/redisson" />

位置如下图:

4、新增redisson配置文件

# 如果redis是单独安装的,将address地址修改为对应主机地址
vim /data/application/tomcat1/conf/redisson.yamlsingleServerConfig:idleConnectionTimeout: 10000connectTimeout: 10000timeout: 3000retryAttempts: 3retryInterval: 1500password: nullsubscriptionsPerConnection: 5clientName: nulladdress: "redis://127.0.0.1:6379"subscriptionConnectionMinimumIdleSize: 1subscriptionConnectionPoolSize: 50connectionMinimumIdleSize: 24connectionPoolSize: 64database: 0dnsMonitoringInterval: 5000
threads: 16
nettyThreads: 32
codec: !<org.redisson.codec.MarshallingCodec> {}
transportMode: "NIO"
#给两外两个tomcat实例拷贝过去
cp /data/application/tomcat1/conf/redisson.yaml /data/application/tomcat2/conf/redisson.yamlcp /data/application/tomcat1/conf/redisson.yaml /data/application/tomcat3/conf/redisson.yaml

5、下载并复制2个Jar包到Tomcat Lib目录中

​cd /root/
wget https://repo1.maven.org/maven2/org/redisson/redisson-all/3.22.0/redisson-all-3.22.0.jar
wget https://repo1.maven.org/maven2/org/redisson/redisson-tomcat-8/3.22.0/redisson-tomcat-8-3.22.0.jar​

拷贝到lib库中

cp /root/redisson-all-3.22.0.jar /data/application/tomcat1/lib
cp /root/redisson-all-3.22.0.jar /data/application/tomcat2/lib
cp /root/redisson-all-3.22.0.jar /data/application/tomcat3/libcp /root/redisson-tomcat-8-3.22.0.jar /data/application/tomcat1/lib
cp /root/redisson-tomcat-8-3.22.0.jar /data/application/tomcat2/lib
cp /root/redisson-tomcat-8-3.22.0.jar /data/application/tomcat3/lib

6、 安装redis

#下载redis
cd && wget http://download.redis.io/releases/redis-5.0.10.tar.gz#解压
tar xzf redis-5.0.10.tar.gz -C /data/application/cd /data/application/ && mv redis-5.0.10/ redis
#下载编译工具
cd redis/ && yum install -y gcc make#编译   注:如果报错请将刚才解压的安装包删除掉,再次重新解压并进行make安装即可。
make
cp redis.conf redis.conf.bakvim redis.conf 
#修改如下
bind 0.0.0.0                       #只监听内网IP,大约在69行
daemonize yes                   #开启后台模式将on改为yes,大约在136行
timeout 300                    #连接超时时间,大约在113行
port 6379                           #端口号,大约在96行
dir /data/application/redis/data  #本地数据库存放持久化数据的目录该目录-----需要存在,大约在263行
pidfile /var/run/redis_6379.pid   #定义pid文件,大约在158行
logfile "/var/log/redis.log"        #定义log文件,大约在171行
#创建存放数据的目录
mkdir /data/application/redis/data

#配置redis为systemctl启动
cd /lib/systemd/systemvim redis.service

 添加下述内容

[Unit]
Description=Redis
After=network.target[Service]
ExecStart=/data/application/redis/src/redis-server /data/application/redis/redis.conf  --daemonize no
ExecStop=/data/application/redis/src/redis-cli -h 127.0.0.1 -p 6379 shutdown[Install]
WantedBy=multi-user.target
#启动redis
systemctl restart redis

7、配置nginx负载均衡

由于本实验是基于Tomcat多实例配置-CSDN博客

因此,nginx负载均衡是已经配置好了得,这里再打开验证一下

8、配置测试页面

所有tomcat实例都配置,注意修改实例的路径

vim /data/application/tomcat1/webapps/ROOT/session.jsp

 #加入下述内容

Session_ID: <%= session.getId() %><BR>
Session_Port: <%= request.getServerPort() %><BR>
Session_URL: <%= request.getRequestURL() %><BR>
<% out.println("This tomcat server 192.168.226.20:8080");%>

注意端口来区分不同实例 

9、session共享测试验证

http://192.168.226.20/session.jsp

 对比访问可以发现,即便后端服务器改变,session也不会再变化了。

基于Redis的Session共享解决了以下几个主要问题:

  1. 横向扩展和负载均衡:在传统的Web应用中,为了处理大量请求和保证高可用性,通常会使用多台服务器来横向扩展应用。然而,会话(Session)状态通常保存在单个服务器的内存中,这就导致了当请求被负载均衡到不同服务器时,会话状态无法被共享,用户需要重新登录或者状态丢失。使用Redis作为会话存储后,不同服务器上的应用实例可以通过Redis共享同一份会话数据,从而实现了跨服务器的会话共享,保证了用户的无缝访问体验。

  2. 内存利用率提升:传统的会话管理方式是将会话状态存储在每个应用服务器的内存中。随着应用服务器数量的增加,会话状态的内存占用也会成倍增加,而且每个服务器的内存使用不均可能导致资源浪费。将会话状态存储在Redis等专门的内存数据库中,可以有效地减少每个应用服务器的内存压力,提高内存利用率。

  3. 会话持久化和可靠性:Redis支持将数据持久化到磁盘,可以配置成持久化到磁盘的数据库中,从而保证会话数据的可靠性。即使应用服务器重启或者故障,用户的会话状态也可以得到恢复,不会丢失,提升了应用的可靠性和容错性。

  4. 分布式应用的统一管理:对于分布式、微服务架构的应用来说,使用统一的会话存储可以简化管理和维护工作。开发人员无需在多个服务或多个服务器上分别管理会话状态,统一的存储和管理会话状态可以降低复杂度,提高开发和维护效率。

综上所述,基于Redis的Session共享通过提供可靠的分布式存储解决方案,解决了传统会话管理中的单点故障、内存浪费和管理复杂度等问题,是构建高性能、可伸缩性和可靠性Web应用的重要手段之一。

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

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

相关文章

【UE5.3】笔记3-静态网格体,BSP

静态网格体组件 主要有两个属性 一个是静态网格体&#xff1a;对应的也就是模型&#xff0c;比如fbx&#xff0c;maya&#xff0c;obj等格式 一个是材质&#xff1a;由各种贴图、渲染设置等&#xff0c;比如unity里的shader BSP画刷&#xff1a; 打开放置Actor选项卡&#…

pandas 查看数据集中某个特征(列)为 NA 的所有行

要查看数据集中某个特征&#xff08;列&#xff09;为 NA 的所有行&#xff0c;可以使用 Pandas 库中的 isna() 或 isnull() 函数来识别缺失值&#xff0c;然后使用布尔索引来筛选这些行。以下我举个例子&#xff1a; 假设数据集存储在一个名为 data.csv 的 CSV 文件中&#x…

做到这九点,工作就无后顾之忧

大家好&#xff0c;今天又跟大家分享一篇&#xff0c;怎么在职场上做到挺起腰杆做事。全文共分9点&#xff0c;尤其最后一点最为重要。篇幅有点长&#xff0c;全文共计三千多字&#xff0c;请耐心看完。 如果您觉得对您有些帮助&#xff0c;点赞收藏关注。谢谢您的支持。 在职场…

Apache Doris主要应用场景和一些实际案例

Apache Doris 是一个现代化的分布式分析型数据库&#xff0c;具备高性能、实时性和高并发性等特点&#xff0c;被广泛应用于多种场景。以下是Doris的主要应用场景和一些实际案例。 应用场景 1. 实时数据分析 数据流处理&#xff1a;Doris可以实时 ingest&#xff08;引入&am…

嵌入式项目分享| 终极智能手表,全过程+全开源分享

这是一个非常完整的智能手表开源项目,功能齐全,且资料开源,如果你是:自己平时喜欢diy的工程师,想要提升开发技能的学生,马上要做毕设的大四学生,这个手表很值得一做,别错过了~~ 所有开源的资料以及原文链接见文末。 先来看下这个手表的功能: 首先,是一个可以佩戴的手…

windows10 无法识别双频合一的5Gwifi

windows10 无法识别双频合一的5Gwifi 在网络配置中指定 wireless mode 为802.11a 或802.11ac 这两个是 5G网络的协议&#xff0c;如果不存在则说明无线网卡不支持5G网络

使用goroutine开多个协程交替打印1234,使用channel实现

使用goroutine开多个协程交替打印1234&#xff0c;使用channel实现 package mainimport ("fmt""sync""time" )var (chNum chan intwg sync.WaitGroup )func main() {chNum make(chan int, 4)chNum <- 1for i : 1; i < 4; i {wg.Add(1…

wss客户端请求(python websocket)

import asyncio import websockets import jsonasync def connect_to_wss(uri):# 连接到WSS服务器async with websockets.connect(uri) as websocket:# 执行一些操作&#xff0c;例如发送和接收消息data {"脱敏处理"}await websocket.send(json.dumps(data))while 1…

MySQL时间转换

1. bigint类型的时间戳 1.1 将bigint转为datetime FROM_UNIXTIME(时间戳 / 1000) 1.2 将bigint转为date 方式一&#xff1a; DATE(FROM_UNIXTIME(时间戳 / 1000)) 方式二&#xff1a;字符串隐式转换 FROM_UNIXTIME(时间戳 / 1000, %Y-%m-%d) 1.3 将bigint转为指定格式的…

修改docker中mongodb容器的时区

假设容器名称为mongodb&#xff0c;设置时区为上海时区的命令为&#xff1a; docker exec -it mongodb bash -c "ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone"验证时区更改&#xff1a; docker e…

51单片机STC89C52RC——9.1 DS1302涓流充电计时芯片

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;DS1302计时器 2.1 特性/板子位置 2.1.1 特性 2.1.2 板子上的位置 2.2 针脚定义 2.3 数据传输 2.3.1 读数据 2.3.2 写数据 2.4 BCD码 2.5 可编程涓流充电器 2.6 时钟动态设置 三&#xff0c;创建Keil项目…

《数据赋能:一本书讲透数字化营销与运营》—— 从正确的数据观开始

基于数据打通的“全链路”营销是当下的“时髦”&#xff0c;应用它的前提是什么&#xff1f;深度营销和运营的关键数据如何获得&#xff1f;如何利用数据进行更精准的营销投放&#xff1f;如何利用数据优化投放的效果&#xff1f;如何促进消费者的转化&#xff0c;以及激活留存…

在 Postman 中使用 Body 进行 POST 请求

Postman 是开发者日常工具箱中不可缺少的一部分&#xff0c;特别是在 API 开发和调试环节中。 为什么使用 POST 请求 POST 请求用于向服务器发送数据&#xff0c;这些数据通常被处理后存储。与 GET 请求不同&#xff0c;POST 请求将数据嵌入请求体&#xff08;Body&#xff0…

005 数据结构

文章目录 线性结构树结构图结构 在计算机科学中&#xff0c;数据结构&#xff08;Data Structure&#xff09;是一种组织和存储数据的方式&#xff0c;它定义了数据的逻辑关系&#xff08;数据的连接方式&#xff09;以及物理存储&#xff08;数据的存储方式&#xff09;。数据…

项目经验之农业技术交流平台

文章目录 一、请你介绍一下你这个项目吧?二、如何使用 Elasticsearch 实现内容资源检索功能,并合理的设计索引Mapping 规则,引入IK中文分词器,详细介绍一下?1. 安装和配置 Elasticsearch 和 IK 分词器2. 配置 Elasticsearch 索引和 Mapping3. 插入数据4. 搜索数据三、整合…

算法刷题日志 hot100 数组分类

文章目录 [169. 多数元素](https://leetcode.cn/problems/majority-element/)旋转图像215. 数组中的第K个最大元素](https://leetcode.cn/problems/kth-largest-element-in-an-array/description/)238. 除自身以外数组的乘积](https://leetcode.cn/problems/product-of-array-e…

HQChart使用教程30-K线图如何对接第3方数据40-日K叠加股票增量更新

HQChart使用教程30-K线图如何对接第3方数据40-日K叠加股票增量更新 叠加股票叠加日K更新Request 字段说明Data.symbol 协议截图返回json数据结构stock HQChart代码地址交流 叠加股票 示例地址:https://jones2000.github.io/HQChart/webhqchart.demo/samples/kline_index_edit.…

等保相关总结

等级划分准则 等保2.0基本框架 等保2.0变化解读 等级测评 3保1评 分保工作简介 分保工作流程 等保 等保工作流程&#xff1a;定级 -》备案 -》整改 -》测评 -》复核 关保 密评

代码随想录算法训练营第五十天| 1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列

LeetCode 1143.最长公共子序列 题目链接&#xff1a;https://leetcode.cn/problems/longest-common-subsequence/description/ 文章链接&#xff1a;https://programmercarl.com/1143.%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97.html 思路 * dp[i][j]…

【自监督-MIM】系列方法学习二

Masked image modeling 是一种训练深度学习模型的技术,尤其是在视觉领域,类似于自然语言处理中的掩码语言建模(Masked Language Modeling)。它通过在输入图像中随机遮挡(或称为掩码)部分区域,然后训练模型来预测这些被遮挡部分的内容,从而提高模型的视觉理解能力。 Ma…