Tomcat8+Redis集群解决会话共享

致远A8+协同系统Windows环境部署全攻略(含SQL Server配置避坑指南) 本文详细介绍了致远A8+协同系统在Windows环境下的完整部署流程,特别针对SQL Server数据库配置中的常见问题提供解决方案。从环境准备、SQL Server深度配置到系统安装与高级配置,帮助用户高效完成部署并避免典型陷阱,提升企业协同办公效率。 阅读详情

瞎  扯

磕磕碰碰一天,百度了好几篇,终于搞定了Session共享的问题。以前只是听说将Session存入第三方来解决Session共享问题,可一直没有亲自动手实现过,还记得以前面试时被一道怎么用Redis解决Session共享问题给怼得老惨,现在再问到,虽然可能还是会被怼,但多多少少能说上几句了。此文纯粹是记录我这一天解决这问题的过程,要想面试打败面试官,多去找找其他博文。

问题起源:服务器端Tomcat集群,负载策略采用的Ip-Hash方式,不存在Session共享问题,后因Jmeter压测,在无权更改测试机为多IP模拟IP欺骗的情况下,将负载策略更改为轮询方式,然后,就有活干了。 

参 考 致 谢

负载策略可参考:https://blog.youkuaiyun.com/qq_35119422/article/details/81505732

需要用到Redis Session Manager for Apache Tomcat项目,https://github.com/jcoleman/tomcat-redis-session-manager ,但是官方说的了,暂时不支持tomcat8,上Github上逛了一圈,无私奉献的大神挺多的,因为我项目用到的是tomcat8.5,找了好几个才找到个简单可用的(没有试是否支持其他版本)。

源码我用的这哥们的:https://github.com/cc-chen/tomcat8.5-redis-session-manager.git,万分感谢!

下 载 配 置

省事的朋友们,可跳过源码,所需jar包我打好了,需要的自行下载:

下载地址:https://pan.baidu.com/s/1DuY-S9GHCgvWmTn1DvvvOg

提取码:cg6g

解压后为这三个jar包,

jedis-2.5.2.jar,

commons-pool2-2.2.jar

tomcat8.5-redis-session-manager.jar

将这三个包放在tomcat的lib目录下,然后修改config目录下context.xml文件,新增如下配置(大多数博主通用配置):

<Valve className="com.s.tomcat.redissessions.RedisSessionHandlerValve" />

<Manager className="com.s.tomcat.redissessions.RedisSessionManager"

        host="127.0.0.1"

        port="6379"

        database="0"

        password="123456"     

        maxInactiveInterval="60" />

参数说明:

通用配置

className:tomcat8.5-redis-session-manager.jar中类全路径,有木有发现,与网上其他大多数博客写的名称不一样,是因为该jar包有修改原官网项目包名。

host:redis master Ip地址

port:redis master 端口

password:redis密码

database:数据库下标(redis默认从0到15 16个分区)

maxInactiveInterval:session超时时间,单位min(测试无效,该怎么设置和失效原因后续会说明)

测试方法:

默认Redis主从集群已经配置好,测试结果如下,(由于是本地,所以Tomcat,Redis均为伪集群,也就是IP一样端口不一样)

在各个tomcat/webapp/ROOT 目录下的jsp页面合适位置加上IP:Port-Session Id : <%= request.getSession().getId() %>(我选择的第51行),启动tomcat8086,8087,tomcat启动前保证Redis主从集群运行正常,否则tomcat启动会报错,启动成功后,访问tomcat主页,在同一浏览器输入:127.0.0.1:8086,127.0.0.1:8087,查看页面的sessionId以及reids中sessionId,如果如图所示,恭喜你,成功一半了:

如果redis中存上了sessionId,且两个tocat服务sessionId一样,重复刷新,sessionId不变,验证成功。

然后删除Redis中的sessionId,再次刷新。

此时sessionId变了,但是两个服务的sessionId仍然一样,验证成功。

大多数博客到这就完了,但真的成功了么?NO!

哨兵集群配置

上面配置是大多数博客都写到的配置,不知道大家发现个问题没,上面host配置只有一个地址,既主节点地址。当redis为单机时,或者集群模式为主从模式时,这样配置才好使,因为我们只需配置主节点连接信息就可以了,但主节点宕了,不就崩了么?现在大多数用到redis的服务,为保证其高可用,几乎都会选择哨兵模式或者Redis-Cluster模式吧。那么问题来了,当主节点宕了后,当其他从节点升级为主节点后,节点连接信息变了,那上面的配置是不是得改了?

不用惊讶,因为当初找到的几篇博客都大同小异,没有提到这种场景,官网看了下,奈何全是英文,就自个研究了下源码,这就是传说中的自己坑自己吧!后来也有看到别的博文介绍哨兵集群时tomcat conf.xml的配置,去官网上也看到了相关的配置说明。不过我弄的时候没看到啊,晕!塞翁失马焉知非福,虽然也不知道研究了下源码得到了啥收获。。。。

要了解多个的配置,首先看看源码中怎么读取单个host,port等配置参数的,找找看:

719行,新建JedislPool用到了咱们配置文件里的参数,看看else另一个条件,那个sentinel单词不就是哨兵么,看看里面相关的sentinelMaster,sentinelSet的get、set方法,

sentinelMaster需要传个master,sentinelSet需要传个sentinels,顾名思义,master是主节点名称,sentinels是各个节点的连接信息,抱着试一试的态度,在context.xml配置文件中又加上俩参数。

同样:这里默认Redis集群模式已经更改为哨兵模式且正常运行(Redis哨兵集群这里就不赘述了)。

sentinelMaster="mymaster"

sentinels="127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381"

新增参数说明:

sentinelMaster:master名称

sentinels:哨兵集群时地址配置,IP:port,用英文逗号隔开

然后重启tomcat集群,接下来继续验证:验证方式和上面一样,当上面两个步骤验证完后,将当前主节点手动关掉,然后再次刷新浏览器验证,发现sessionId依然有效,至此,已经成功百分之九十了。

过期时间

剩下的百分之十,就是session过期的问题了。在启动tomcat时,会有个警告

说明那个maxInactiveInterval参数配置有点问题。出问题了,那就源码里看看啥情况,找到源码中设置session超时时间的地方,在RedisSessionManager类中,377和545行还有632行,这个时间值都用到的getMaxInactiveInterval()方法,如下

再看看getMaxInactiveInterval()方法

看到这儿似乎明白了,本项目中并不是根据我们的配置文件中参数赋值,这个时间设置的值取的是Tomcat容器的session-timeout 节点(单位min),更改tomcat  conf/web.xml配置,约595行

<session-config>

        <session-timeout>10</session-timeout>

</session-config>

去掉配置文件中的maxInactiveInterval参数,更改web.xml 中session-timeout时间为2分钟,重启Tomcat测试session失效场景,验证成功,至此Tomcat8.5集成Redis 解决Session会话共享问题算是大功告成!

谨记,官方文档很重要!很重要!很重要!仔细看看会少走很多弯路!

以上内容均为个人对别人成果的学习和总结,有理解不到位的地方,还请各路大神指点!

原创不易,看了觉得有帮助的朋友们,记得点个赞哟,谢谢!

Tomcat 8 集群 Session 共享:用 tomcat-redis-session-manager 告别登录掉线 Java Web 应用中,Session 是维持用户登录态的关键机制;在单机场景下由 Tomcat 内存直接管理,问题不大。但一旦进入多节点负载均衡环境,原生 Tomcat Session 与具体进程绑定,不同节点各自为政,用户请求被轮询到另一台机器时极易出现“登录后掉线”或状态错乱。解决思路是引入分布式会话存储,把 Session 统一外置到 Redis,通过序列化与反序列化实现跨节点读写,让任意节点都能认出同一登录用户。这样既能支撑集群的高可用与弹性扩缩容,也能避免节点重启导致的大面积会话丢失。对于仍运 阅读详情

相关推荐

Tomcat 8 集群 Redis 会话共享实战:从登录态漂移到灰度切流

在集群与负载均衡架构中,HTTP 会话共享是保障登录态一致的基础能力。其核心是将容器内存中的 Session 交由 Redis 等外部存储统一管理,通过 Key-Value 读写、TTL 过期和序列化机制实现跨节点可见。这样可避免粘性会话在节点重启或 GC 后失效,降低登录态漂移与随机掉线风险。适用于 Tomcat 8 存量应用、多节点部署、希望少改代码的会话集中管理场景。围绕 tomcat-redis-session-manager 的 Manager/Valve 配置、Jedis 连接池、类加载器放置与

weixin_30899023的博客 243

tomcat-redis解决多系统session同步问题

场景:在做集群或系统拆分的时候,经常会有用户登录session同步等问题。 参考链接:https://github.com/jcoleman/tomcat-redis-session-manager

Summer凌枫的博客 1477

Tomcat集群集成Redis会话管理解决方案

Redis集群通过分布式存储提供高可用性,能够在节点故障的情况下继续提供服务。集群将数据分散存储在多个节点上,实现数据的分片与备份,这样即便部分节点发生故障,系统也能通过其他节点来恢复数据。配置Redis集群首先需要准备多个Redis实例。以下是一个Redis集群的简化配置示例:# Redis实例1配置 redis-7000.confport 7000# Redis实例2配置 redis-7001.confport 7001# 以此类推...

weixin_35815766的博客 807

tomcat集群使用redis实现session共享

1、网上查找资料,大部分从下面网址下载java代码,因是几年前实现的(大概2,3年前吧),不支持tomcat8https://github.com/jcoleman/tomcat-redis-session-manager 2、在myeclipse 新建一个maven项目【maven-archetype-quickstart】 源文件新建包名com.orangefunction.tomcat.r...

zhangMY12138的博客 597

基于Tomcat与Redis的分布式会话共享解决方案

默认情况下,Tomcat使用生成随机Session ID,长度为16字节(32字符十六进制)。但在高安全要求系统中,可替换为更强的生成策略。try {});@Override// 截取前128bit编译打包后,在context.xml中注册:代码解释:使用SHA-256哈希函数增加碰撞难度。获取操作系统级强随机源。返回32位小写十六进制字符串,兼容现有Cookie格式。相比原生MD5/UUID方案,抗暴力破解能力显著提升。

weixin_31569663的博客 858

Apache Tomcat 8.5.55集成Redis会话管理的集群化部署方案

本文还有配套的精品资源,点击获取 简介:该压缩包包含已集成“tomcat-cluster-redis-session-manager 4.0”的Apache Tomcat 8.5.55,提供基于Redis的分布式会话管理解决方案。通过将Tomcat默认内存会话存储替换为Redis,实现多实例间的会话共享,提升Web应用在集群环境下的高可用性与可扩展性。本方案适用于需要负载均衡和故障恢复能力的Java Web应用,支持无缝会话持久化与跨节点访问,显著增强系统稳定性与用户体验。

weixin_29840475的博客 1203

Nginx+Tomcat集群

Nginx+Tomcat搭建高性能负载均衡集群 使用nginx搭建集群tomcat8,redis实现session共享,文件共享问题

weixin_33790053的博客 90

Tomcat 8集群Session共享:Redis会话管理配置与排错

在负载均衡与多节点部署中,分布式会话管理是保障登录态一致的基础能力。Tomcat 默认 StandardManager 将 Session 保存在单机 JVM 堆内,节点切换或扩容后会话无法共享;以 Redis 作为集中式会话存储,并由 Tomcat Manager 接管序列化、过期与连接池读写,可让集群内任意节点读取同一份 Session,提升横向扩展稳定性和无状态化迁移效率。该方案适用于 Tomcat 8 集群、灰度发布、电商登录态、后台多应用共库等场景。落地时需重点核对 tomcat-redis-se

weixin_32430941的博客 280

Nginx+Tomcat实现高可用和Session会话共享

高可用负载均衡+nginx+会话共享web集群部署+redis哨兵 对于生产环境有了一定规模的tomcat集群业务来说,要实现session会话共享,比较稳妥的方式就是使用数据库持久化session.为什么要持久化session(共享session)呢?因为在客户端每个用户的Session对象存在Servlet容器中,如果Tomcat服务器重启或者宕机的话,那么该session就会丢失,而客户...

. 8399

tomcat8.5+redis的session共享所需jar

tomcat8.5+redis的session共享所需要的jar,里面含有context.xml配置。

Tomcat8下Redis Session共享解决方案 包含集群配置

基于之前支持Tomcat7以下的redis-Session共享机制 进行相关适配的修改打包,里面包含所需Jar包以及相关的说明配置文档,包括:--单点授权Reids配置;- Sentinel 配置 ;- Redis Cluster 配置 ;适用于Tomcat8的容器环境,8以上的环境暂未测试,不过应该也兼容

Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

作者:蕃薯耀链接:www.cnblogs.com/fanshuyao一、Session共享使用tomcat-cluster-redis-session-manager插件实现插件地址见:...

Java笔记虾 592

nginx+tomcat+redis集群配置session共享(下载运行即可)+详细说明

本实例基于nginx+tomcat+redis的集群实现,实现session的复制。压缩包内含两个tomcat+一个nginx服务器+64位windows版的redis+说明文档,下载即可运行,详细步骤可以参考文档,从此告别集群盲区

Tomcat会话集群高效实践:Redis分布式会话共享进阶指南

在现代Web应用架构中,随着用户规模增长和服务可用性要求提升,传统单机Tomcat会话管理已无法满足集群部署需求。**Tomcat会话集群**技术通过将会话数据存储在分布式缓存中,实现了请求的无状态化处理,使应用能够轻松扩展为多节点架构。本文将从核心价值解析、环境适配指南、场景化配置、运维优化策略到生态拓展图谱,全面介绍如何基于Redis实现Tomcat会话共享的高效实践方案。 ## 核心价值解

gitblog_00887的博客 251

使用VScode编译AMI代码

我现在了解到的和拿到的code,都是基于AMI的code,一般的编译AMI都需要搭配使用AMI的编译环境Veb,而Veb用到现在,一直都觉得有点卡顿,浏览代码的体验也比VScode差很多。在这之前还要,考虑设置TOOLS_DIR和EWKE_DIR的环境变量,因为在Veb中是可以通过设置自动设置的,但是VScode里面没用设置环境变量的选项。这里可以看出,Veb工具栏中的Build和Rebuild All的命令对应这里的make和make rebuild,也就是说Veb是调用此命令进行编译的。

Dodijd的博客 1883

从AXI到CHI:深入解析基于Credit的流量控制如何优化NoC设计

本文深入解析了从AXI握手式流控到CHI基于Credit的流量控制机制的演进。通过对比传统流控的瓶颈,详细阐述了Credit机制如何通过信用预分配和记账系统,有效解决FIFO气泡、时序收敛等难题,从而优化NoC设计的带宽利用率、降低延迟并提升系统可扩展性。

weixin_29227585的博客 522

Tomcat8通过Redis实现session共享录

Tomcat通过Redis实现session共享的完整部署记录 对于生产环境有了一定规模的tomcat集群业务来说,要实现session会话共享,比较稳妥的方式就是使用数据库持久化session.为什么要持久化session(共享session)呢?因为在客户端每个用户的Session对象存在Servlet容器中,如果Tomcat服务器重启或者宕机的话,那么该session就会丢失,而客户...

rdhj5566的专栏 1242

RandLA-Net 调通代码1:Windows 11 + Tensorflow 2.4 + S3DIS数据集【踩坑+填坑】

TF不上进啊,学学pytorch

累了就要打游戏 2483

windows下tomcat8.5基于redis+ tomcat-cluster-redis-session-manager实现session共享

  1.通过环境 本文档基于windows环境实现,测试通过环境: Windows Server 2012 R2 Datacenter 64位 Tomcat-8.5.30-windows-x64 Redis-x64-3.0.504 tomcat-cluster-redis-session-manager2.0.4   2.安装redis redis项目地址:https://gith...

vzdong1的博客 3226

在ROS中使用行为树

在ROS中使用行为树 我提供的工程示例文件: demo链接 文章目录在ROS中使用行为树0、 学习本教程的前提1、 behaviorTree 库安装(ROS使用下的安装方式)2、 处理 behaviortree 库并准备好 service 和 ros action2.1 对ROS 的 service 和 action 进行封装,使其在 behaviortree 上使用更加方便。2.2 创建一个 service 和一个 action2.3 创建与决策树相关的数据类型2.4 修改`package.xml`文件2

qq_37416258的博客 6379

使用光流进行 Warp 的流程

光流描述了图像帧中每个像素的运动。前向光流:描述了帧中每个像素在帧中的移动位置。后向光流:描述了帧中每个像素在帧​ 中的移动位置。水平方向的位移(x 方向),即每个像素水平移动了多少像素。垂直方向的位移(y 方向),即每个像素垂直移动了多少像素。使用光流进行 Warp 的流程Warp 是通过光流对图像进行变换的操作,旨在将前一帧的像素根据光流场映射到下一帧的对应位置。Step 1: 计算光流我们首先需要通过光流网络(如 RAFT)来估算两帧之间的光流。我们可以获得前向光流(从帧​ 到帧。

qq_44199605的博客 2108

搭建Tomcat集群&通过Redis缓存共享session的一种流行方案

为什么要共享session? 我们使用单台Tomcat的时候不会有共享sesssion的疑虑,只要使用Tomcat的默认配置即可,session即可存储在Tomcat上。 但是随着业务的扩大,增加Tomcat节点构成Tomcat集群大势所趋,分布式带来了增加更大规模并发请求的优势,但是也随之到来了一个问题,每个Tomcat只存储来访问自己的请求产生的session,如果

IT民工工厂 3813

Vectorless dynamic动态功耗分析——Voltus

power 计算工具会根据设计信息和用户提供的activity和switching约束来生成虚拟的worst-case的power vector,难点在于哪些instances视为switching,在没有仿真的前提下如何确定开关的时间,使用timing文件(TWF)

qq_44347276的博客 2790
上一篇: 幂等性学习笔记
github_38806262
博客等级 码龄10年 8粉丝 11原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值