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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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
相关文章
|
3天前
|
前端开发 关系型数据库 MySQL
SpringBoot-----从前端更新数据到MySql数据库
SpringBoot-----从前端更新数据到MySql数据库
10 1
|
3天前
|
存储 关系型数据库 MySQL
MySQL是怎样存储数据的?
MySQL是怎样存储数据的?
|
3天前
|
JSON 前端开发 Java
管理系统总结(前端:Vue-cli, 后端Jdbc连接mysql数据库,项目部署tomcat里)
管理系统总结(前端:Vue-cli, 后端Jdbc连接mysql数据库,项目部署tomcat里)
|
3天前
|
安全 关系型数据库 MySQL
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
27 3
|
3天前
|
关系型数据库 MySQL 数据库
【后端面经】【数据库与MySQL】12|数据库锁:明明有行锁,怎么突然就加了表锁?
【4月更文挑战第15天】在MySQL的InnoDB引擎中,锁通过索引实现,主要锁定叶子节点。查询使用哪个索引,就锁哪个;无索引时锁全表。若查询值不存在,InnoDB会构造临键锁阻止插入。锁在事务结束(Rollback或Commit)时释放。乐观锁在尝试更新时检查数据变化,适合读多写少场景,悲观锁一开始就加锁,适用于写多读少。InnoDB支持行锁和表锁,行锁依赖索引。共享锁允许多个线程加同类型锁,排它锁则独占。
45 1
|
3天前
|
SQL NoSQL 关系型数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?-02
【4月更文挑战第13天】该文介绍了几个数据库查询优化技巧。首先,创建覆盖索引如&lt;A,B,C&gt;能加速`select A,B,C from student where A=? and B=? and C=?`的执行。其次,为常用于排序的列建立索引,如在`id,update_time`上建索引,可避免数据排序,显著提高查询速度。优化`count(*)`可通过预估值或使用Redis记录总数,但需注意数据一致性问题。使用索引提示如FORCE INDEX可强制使用特定索引,但应谨慎。将`having`的非聚合条件移到`where`里可提升效率。最后,处理深度分页时
25 3
|
3天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
70 3
|
3天前
|
存储 关系型数据库 MySQL
【后端面经】【数据库与MySQL】为什么MySQL用B+树而不用B树?-02
【4月更文挑战第11天】数据库索引使用规则:`AND`用`OR`不用,正用反不用,范围中断。索引带来空间和内存代价,包括额外磁盘空间、内存占用和数据修改时的维护成本。面试中可能涉及B+树、聚簇索引、覆盖索引等知识点。MySQL采用B+树,因其利于范围查询和内存效率。数据库不使用索引可能因`!=`、`LIKE`、字段区分度低、特殊表达式或全表扫描更快。索引与NULL值处理在不同数据库中有差异,MySQL允许NULL在索引中的使用。
19 3
|
3天前
|
存储 关系型数据库 MySQL
【后端面经】【数据库与MySQL】为什么MySQL用B+树而不用B树?-01
【4月更文挑战第10天】B+树是一种多叉树,用于数据库索引,其特征包括叶子节点存储数据并用链表串联,非叶子节点仅存关键字。由于较低的高度和链表结构,B+树提供高效查询和范围查询。索引分类有聚簇(叶子节点存储数据)和非聚簇,以及覆盖、唯一、前缀、联合、全文和哈希索引。聚簇索引如主键索引,非聚簇索引叶子节点存储主键。覆盖索引可避免回表,提高性能。查询遵循最左匹配原则,优化SQL应选取所需列并考虑常见查询。
23 4
|
3天前
|
缓存 NoSQL 关系型数据库
MySQL与Redis的默契协作:解析数据一致性难题与解决方案
MySQL与Redis的默契协作:解析数据一致性难题与解决方案
27 0
MySQL与Redis的默契协作:解析数据一致性难题与解决方案

推荐镜像

更多