基于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 | 系统 |
| nginx | 192.168.226.20 | rocky_linux9.4 |
| tomcat1 | 192.168.226.20:8080 | rocky_linux9.4 |
| tomcat2 | 192.168.226.20:8081 | rocky_linux9.4 |
| tomcat3 | 192.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共享解决了以下几个主要问题:
-
横向扩展和负载均衡:在传统的Web应用中,为了处理大量请求和保证高可用性,通常会使用多台服务器来横向扩展应用。然而,会话(Session)状态通常保存在单个服务器的内存中,这就导致了当请求被负载均衡到不同服务器时,会话状态无法被共享,用户需要重新登录或者状态丢失。使用Redis作为会话存储后,不同服务器上的应用实例可以通过Redis共享同一份会话数据,从而实现了跨服务器的会话共享,保证了用户的无缝访问体验。
-
内存利用率提升:传统的会话管理方式是将会话状态存储在每个应用服务器的内存中。随着应用服务器数量的增加,会话状态的内存占用也会成倍增加,而且每个服务器的内存使用不均可能导致资源浪费。将会话状态存储在Redis等专门的内存数据库中,可以有效地减少每个应用服务器的内存压力,提高内存利用率。
-
会话持久化和可靠性:Redis支持将数据持久化到磁盘,可以配置成持久化到磁盘的数据库中,从而保证会话数据的可靠性。即使应用服务器重启或者故障,用户的会话状态也可以得到恢复,不会丢失,提升了应用的可靠性和容错性。
-
分布式应用的统一管理:对于分布式、微服务架构的应用来说,使用统一的会话存储可以简化管理和维护工作。开发人员无需在多个服务或多个服务器上分别管理会话状态,统一的存储和管理会话状态可以降低复杂度,提高开发和维护效率。
综上所述,基于Redis的Session共享通过提供可靠的分布式存储解决方案,解决了传统会话管理中的单点故障、内存浪费和管理复杂度等问题,是构建高性能、可伸缩性和可靠性Web应用的重要手段之一。
相关文章:
基于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复制及ses…...
postgres数据库的流复制
1. 流复制和逻辑复制的差异 逻辑复制和流复制最直观的不同是,逻辑复制支持表级别复制区分点事原理不同 逻辑日志是在wal日志产生的数据库上,由逻辑解析模块对wal日志进行初步的解析,解析结果是ReorderBufferChange(理解为HeapTup…...
Dxf库中的DL_Extrusion类
类DL_Extrusion DL_Extrusion 是 DXF 库中的一个类,用于表示三维实体的扩展信息。在 DXF 文件中,DL_Extrusion 类通常用于表示具有高度的三维图形实体,如立方体、圆柱体等,以及其它具有体积的几何对象。 以下是一个简单的示例代…...
“ONLYOFFICE 8.1版本评测:功能更强大,用户体验更佳”
最新版本的在线编辑器已经发布 ONLYOFFICE在线编辑器的最新版本8.1已经发布,整个套件带来了30多个新功能和432个bug修复。这个强大的文档编辑器支持处理文本文档、电子表格、演示文稿、可填写的表单和PDF,并允许多人在线协作,同时支持AI集成…...
搜维尔科技:【研究】触觉手套比控制器更能带来身临其境、更安全、更高效的虚拟体验
自然交互可提高VR模拟的有效性。研究表明,触觉手套比控制器更能带来身临其境、更安全、更高效的虚拟体验。 以下是验证 医疗培训中的触觉技术 “ 95.5%的参与者表示触摸是 XR 教育的重要组成部分,90.9% 的参与者表示 XR 触觉将提供一个安全的学习场所。…...
【小学期】实体类设计——以学生管理系统为例
项目目录中的位置 将Student.java文件放在src/model目录中,即: student_management │ ├── src │ ├── model │ │ ├── Student.java // 这里是Student实体类 │ │ └── StudentDAO.java │ │ │ ├── view │ │ …...
Java测试类
在Java中,为了编写测试类,通常使用JUnit框架。 1. 首先,创建一个名为Calculator的简单Java类,它包含一个方法add用于计算两个整数的和: public class Calculator {public int add(int a, int b) {return a b;} } 2.…...
python 中面向对象编程:深入理解封装、继承和多态
在本章中,我们将深入探讨Python中的高级面向对象编程概念,包括封装、继承和多态。让我们开始吧! 目录 面向对象简介类和实例属性和方法继承和多态 高级面向对象概念私有变量使用 property使用 __slots__类的特殊成员__doc____call____str____…...
OpenCV练习(2)图像校正
1、傅里叶变换 霍夫变换 直线 角度 旋转2、边缘检测 霍夫变换 直线角度 旋转3、四点透视 角度 旋转4、检测矩形轮廓 角度 旋转 1.目的 实现类似全能扫面王的图像校正功能 2. 基于轮廓提取和透射变换 基于轮廓提取和透射变换的矫正算法更适用于车牌、身份证、人民…...
Excel中的“点选输入”——次级下拉列表创建
在Excel中,用“数据验证”功能可以设置下拉列表,二级下拉列表需要设置公式。 (笔记模板由python脚本于2024年06月16日 18:36:37创建,本篇笔记适合经常使用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:http…...
基于 Spring AOP 实现安全检查
在现代应用程序中,安全性是一个至关重要的方面。通过对系统中的关键操作进行安全检查,可以有效防止未授权的访问和操作。Spring AOP(面向切面编程)提供了一种优雅的方式来实现安全检查,而无需修改业务逻辑代码。本文将…...
【MySQL】数据库事务详解
文章目录 前言1. 事务的定义2. 事务的四个特性2.1 原子性2.2 一致性2.3 隔离性2.4 持久性 3. 事务的并发问题3.1 脏读3.2 不可重复读3.3 幻读3.4 更新丢失 4. 事务的隔离级别5. 事务的使用结语 前言 假设我们现在需要操作数据库进行转账,A 给 B 转账 100 块钱&…...
ubuntu链接mysql
C链接mysql 报错 sudo apt-get update sudo apt-get install libmysqlclient-dev 指令编译 g -o mysql_example mysql_example.cpp -I/usr/include/mysql -lmysqlclient g mysql_test.cpp mysql_config --cflags --libs 安装mysql sudo apt updatesudo apt install mysql-…...
QStyledItemDelegate 和 QItemDelegate 的作用
在Qt中,QStyledItemDelegate和QItemDelegate是用于自定义和控制项视图控件(如QListView、QTableView、QTreeView)中项的显示和编辑的委托类。它们提供了对项的外观和编辑行为的定制能力。尽管它们在功能上有相似之处,但它们之间有…...
3.任务的创建与删除
1.什么是任务? 任务可以理解为进程/线程,创建一个任务,就会在内存开辟一个空间。 任务通常都含有while(1)死循环 2.任务创建与删除相关的函数 3.CUBEMAX相关配置 编辑一个led1闪烁的任务...
进程、CPU、MMU与PCB之间的关系
目录 进程与cpu(中央处理器) 源代码、程序、cpu与进程的关系 cpu超线程 CPU的简易架构与处理数据过程 进程与MMU(内存管理单元) mmu作用 cpu和mmu的关系 进程与PCB(进程控制块) PCB介绍与内部成员…...
代码随想录算法训练营Day50|1143.最长公共子序列、1035.不相交的线、53.最大子序和、392.判断子序列
最长公共子序列 1143. 最长公共子序列 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 最长公共子序列 - 动态规划 Longest Common Subsequence - Dynamic Programming_哔哩哔哩_bilibili 本题和上一题718.最长重复子数组在很多方面相似…...
国家自然科学基金标书大全(2002-2024)
数据来源:在20世纪80年代初,为了促进中国的科技体制革新并改革科研资金分配机制,中国科学院的89位院士联名向党和国家领导人提出建议,设立了国家自然科学基金的设立。国自然基金自创立以来,根据国家发展科学技术方针、…...
Python代码打包成exe应用
目录 一、前期准备 二、Pyinstaller打包步骤 Pyinstaller参数详解 三、测试 Spec 文件相关命令 一、前期准备 (1)首先,我们需要确保你的代码可以在本地电脑上的pycharm正常运行成功。 (2)我们要先安装Pyinstalle…...
CesiumJS【Basic】- #016 多边形面渲染“花了”的问题
文章目录 多边形面渲染“花了”的问题1 目标2 问题代码3 修正后代码4 总结多边形面渲染“花了”的问题 1 目标 解决多边形的面“花了”的问题 2 问题代码 使用Cesium.PerInstanceColorAppearance渲染后出现色斑 import * as Cesium from "cesium";const viewer …...
Uncertainty-Aware Pixel-Level Contrastive Learning for Enhanced Semi-Supervised Medical Image Segmen
1. 医学图像分割的挑战与半监督学习机遇 医学图像分割一直是计算机视觉领域的重要研究方向,它能够帮助医生快速定位病灶区域,提高诊断效率。但在实际应用中,我们常常面临标注数据稀缺的问题——专业医生标注一张CT或MRI图像可能需要数小时&am…...
Z-Image-Turbo-rinaiqiao-huiyewunv参数详解:Turbo模型推荐步数/CFG/精度配置原理剖析
Z-Image-Turbo-rinaiqiao-huiyewunv参数详解:Turbo模型推荐步数/CFG/精度配置原理剖析 1. 引言:为什么你的AI绘图效果总是不理想? 如果你用过一些AI绘图工具,可能会遇到这样的问题:生成的图片要么模糊不清࿰…...
__attribute__((unused))的妙用:如何优雅地处理未使用的变量与参数
1. 为什么我们需要__attribute__((unused)) 在C/C开发中,编译器警告就像一位严格的代码审查员,时刻提醒我们可能存在的问题。但有时候,我们确实需要定义一些暂时不使用的变量或参数,比如为了保持接口兼容性,或者在某些…...
技术小白AI入门避坑指南:避开4大雷区,高效进阶不走弯路
技术小白AI入门避坑指南:避开4大雷区,高效进阶不走弯路 前言:作为技术小白,入门AI的路上,最可怕的不是“基础薄弱”,而是“走偏方向”——明明付出了时间和精力,却因为踩中误区,要么…...
Mac Mouse Fix技术深度解析:从底层事件处理到高级鼠标功能增强的架构演进
Mac Mouse Fix技术深度解析:从底层事件处理到高级鼠标功能增强的架构演进 【免费下载链接】mac-mouse-fix Mac Mouse Fix - A simple way to make your mouse better. 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix Mac Mouse Fix是一款革…...
5个秘诀:如何快速生成专业艺术二维码的完整指南
5个秘诀:如何快速生成专业艺术二维码的完整指南 【免费下载链接】amazing-qr 💮 amazing QRCode generator in Python (supporting animated gif) - Python amazing 二维码生成器(支持 gif 动态图片二维码) 项目地址: https://g…...
实时数据流处理实战:从滑动窗口算法到Docker部署
用 Python 造一个轻量级流处理引擎,顺便把 Git、Docker、CI/CD 全串起来 前言 你是否有过这样的需求:统计过去 5 秒内 API 的请求次数、监控传感器数据的突变、或者对直播间的弹幕进行限流?这些场景都离不开实时数据流处理。而流处理的核心&…...
【实战指南】Green Hills MULTI-IDE 从零安装到嵌入式开发环境搭建
1. Green Hills MULTI-IDE 初探:为什么选择它? 如果你正在寻找一款强大的嵌入式开发工具,Green Hills MULTI-IDE 绝对值得考虑。作为一个在嵌入式领域摸爬滚打多年的老手,我用过Keil、IAR等各种IDE,但MULTI-IDE给我的体…...
嵌入式系统错误处理机制与实现
嵌入式系统中的错误处理机制深度解析1. 错误概念与分类1.1 错误分类体系在嵌入式系统开发中,错误处理是确保系统可靠性的关键环节。从严重性维度分析,程序错误可分为两类:致命性错误:系统无法执行恢复操作,典型处理方式…...
Tailwind CSS在Vue3+Vite项目中的实战应用:从零到响应式按钮
Tailwind CSS在Vue3Vite项目中的实战应用:从零到响应式按钮 如果你正在使用Vue3和Vite构建现代Web应用,却对传统CSS的维护成本感到头疼,那么Tailwind CSS可能会成为你的新宠。这个实用优先的CSS框架彻底改变了我们编写样式的方式——不再需要…...
