session共享问题及四种解决方案-前端存储、session的复制 、session粘性、后端存储(Mysql、Redis等)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
简介: session共享问题及解决方案

tomcat的安装与配置


tomcat的安装

官网下载

Apache Tomcat官网

我下载的版本为8.5.82

7e354ff584b74ca780399b8490b042ca.png

解压两份

a97adaace08743d0be95900e6825f518.png

tomcat集群的配置


官网提供的配置f1a3242f29d94d73a7d2977f528b8433.png7d23fc889de94f8b96035ffc52eac3aa.pngfda2f588963f4ee99b4b239b97ed1607.png

官网配置地址

c560ac8546ee42b494d6b0fe1545a807.png

我的配置步骤

  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">
          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>
          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
          </Channel>
          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>

1、将上面的复制到两个tomcat的server.xml配置文件中

aadbe1a6fd1b44af81387a16dd4c32ea.png

2、改端口

为啥改端口:因为我只有一台电脑


只要不与tomcat1相同就行

f1a3242f29d94d73a7d2977f528b8433.png7d23fc889de94f8b96035ffc52eac3aa.pngfda2f588963f4ee99b4b239b97ed1607.png


3、在tomcat1和tomcat2中的webapps\ROOT目录下删除页面然后加上这三个页面


第一个是index,第二个是login,第三个是logout

index是首页,login是设置session,logout是删除session

把tomcat2改为tomcat1然后继续复制

80ccadf49bc94ffcaf21987bfa22fb3f.png

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
  <title>
  tomcat2
  </title>
  </head>
    <body>
        SessionID:<%=session.getId()%>
    <br>
        SessionValue:<%=session.getAttribute("session")%>
        <br>
    SessionIP:<%=request.getServerName()%>
        <br>
    SessionPort:<%=request.getServerPort()%>
    <br>
        <%
            out.println("this is tomcat 2");
        %>
    </body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
  <title>
  tomcat2
  </title>
  </head>
    <body>
        <%
      session.setAttribute("session","libo");
    %>
        <%
            out.println("this is set SessionValue success");
        %>
    </body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
  <title>
  tomcat2
  </title>
  </head>
    <body>
        <%
      session.removeAttribute("session");
    %>
        <%
            out.println("this is remove SessionValue success");
        %>
    </body>
</html>


session问题解决方法


前端存储

原理

每次前端发请求时候都把这个携带走

4909059c93fb438baa6d6a29cd5169ca (1).png

优缺点

优点

不占用服务端内存


缺点

存在安全风险

数据大小受cookie限制

占用外网宽带


session的复制

操作步骤

在每个tomcat 的 “webapps\ROOT\WEB-INF\web.xml” 里面加上 distributable标签

e51cf65ffef444be8e9ced407ab2c1b3.png

都没有登录05d7e0229a36468592abd08f23b5fbbe.png

tomcat1登录

a464ebfd58334b6b8ed5e1334fbad6a6.png

tomcat2查看是否可以获取数据

获取成功8d8ea8de9d134fb49f244b64d6312564.png


tomcat1退出

b528729fd1b44e7a99ffd50325cc17be.png

tomcat2查看是否可以获取数据

获取不到了,因为session是共享,已经在tomcat1那里退出登录了

495cf848e3b9456f84ef728bcbc72a3e.png

原理

多个server之间相互同步session,这样每个server之间都包含全部的session

631068384eea4249a46d73f3b50066b4.png

优缺点

优点

1、只需要设定配置,应用程序不需要修改代码

2、有一台机器挂了,其他机器还保存有


缺点

1、ession的同步需要数据传输,占内网带宽,有延时

2、所有server都包含所有session数据,数据量受最小内存的sever限制


session粘性

操作步骤

下载安装nginx

官网下载,我是已经下载过的了

CSDN博客找篇按照下载


配置nginx.conf

这样就会轮询两个tomcat服务器

e4c36920337b481b80d4e519695e53d3.png

把刚才tomcat里面的web.xml去掉distributable标签

访问localhost然后就会一直是一个tomcate21a730aafb5413b85cba7c32e902bdb (1).png

注意

fc05d8db557f41cba5be75bd7f26a312.png

原理

可以通过某种形式,将用户的每次请求都固定到某一台机器上。例如通过Nginx的ip_hash策略进行负载均衡,只要用户的IP固定不变,总能访问到同一台服务器上

b57e19917ee54ea3b9ba346b23fee7b8.png

优缺点

优点

无需修改代码

服务端可以水平扩展


缺点

如果某台服务器挂掉了,Session就会丢失

如果一个局域网内大量用户那么也没啥用了(使用默认的ip_hash算法)


后端存储(Mysql、Redis等)

原理都是一样的,但是如果要是海量请求同时发送,请求数据库,容易造成数据库的压力过大从而崩溃,所以我们演示是基于Redis

操作步骤

访问我仓库下载代码

点击进入

原理

传统模式中,当request进入web容器,根据request获取session时,如果容器内存在session则返回,如果不存在就创建一个session然后返回,将sessionId返回

后端存储就是将session从容器里面抽出来,形成独立的模块,以便分布式或者集群能够共享。当request进入容器时,根据request获取session时,去找redis如果存在就返回,如果不存在就创建并存储

239d9b23b77846f18c0c6ac41974b255.png

优缺点

优点

代码灵活,对web容器无侵入

速度比mysql更快


缺点

需要编写代码


239d9b23b77846f18c0c6ac41974b255.png239d9b23b77846f18c0c6ac41974b255.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
前端开发 关系型数据库 MySQL
【前端学java】MySQL数据库的本地安装
【8月更文挑战第12天】MySQL数据库的本地安装
40 3
|
2月前
|
JavaScript NoSQL Redis
Vue中实现修改邮箱、手机号等流程的大致过程、验证码由后端的redis生成验证(版本1.0)
这篇文章记录了在Vue中实现修改手机号和邮箱的大致流程,包括使用过滤器部分隐藏展示的手机号和邮箱,以及通过点击触发路由跳转的便捷方式。文章还描述了旧号码和新号码验证的界面实现,其中验证码由后端生成并通过弹窗展示给用户,未来可以接入真正的手机验证码接口。此外,还提供了修改邮箱的页面效果截图,并强调了学习是一个永无止境的过程。
Vue中实现修改邮箱、手机号等流程的大致过程、验证码由后端的redis生成验证(版本1.0)
|
2天前
|
存储 前端开发 Java
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
4 0
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
|
10天前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
37 2
|
19天前
|
NoSQL 关系型数据库 MySQL
当Redis与MySQL数据一致性校验中Redis数据量小于MySQL时的全量查询处理方法
保持Redis和MySQL之间的数据一致性是一个需要细致规划和持续维护的过程。通过全量数据同步、建立增量更新机制,以及定期执行数据一致性校验,可以有效地管理和维护两者之间的数据一致性。此外,利用现代化的数据同步工具可以进一步提高效率和可靠性。
40 6
|
1月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
1月前
|
缓存 NoSQL 关系型数据库
MySQL与Redis缓存一致性的实现与挑战
在现代软件开发中,MySQL作为关系型数据库管理系统,广泛应用于数据存储;而Redis则以其高性能的内存数据结构存储特性,常被用作缓存层来提升数据访问速度。然而,当MySQL与Redis结合使用时,确保两者之间的数据一致性成为了一个重要且复杂的挑战。本文将从技术角度分享MySQL与Redis缓存一致性的实现方法及其面临的挑战。
66 2
|
2月前
|
数据采集 数据可视化 关系型数据库
【优秀python web设计】基于Python flask的猫眼电影可视化系统,可视化用echart,前端Layui,数据库用MySQL,包括爬虫
本文介绍了一个基于Python Flask框架、MySQL数据库和Layui前端框架的猫眼电影数据采集分析与可视化系统,该系统通过爬虫技术采集电影数据,利用数据分析库进行处理,并使用Echart进行数据的可视化展示,以提供全面、准确的电影市场分析结果。
|
2月前
|
NoSQL 关系型数据库 MySQL
无法访问Docker 里的 mysql, redis
无法访问Docker 里的 mysql, redis
20 0
|
27天前
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架

热门文章

最新文章