谈一谈分布式会话

一、什么是会话

会话Session代表的是客户端与服务器的一次交互过程,这个过程可以是连续也可以是时断时续的。曾经的Servlet时代(jsp)),一旦用户与服务端交互,服务器tomcat就会为用户创建一个session,同时前端会有一个jsessionid,每次交互都会携带。如此一来,服务器只要在接到用户请求时候,就可以拿到jsessionid,并根据这个ID在内存中找到对应的会话session,当拿到session会话后,那么我们就可以操作会话了。会话存活期间,我们就能认为用户一直处于正在使用着网站的状态,一旦session超期过时,那么就可以认为用户已经离开网站,停止交互了。用户的身份信息,我们也是通过session来判断的,在session中可以保存不同用户的信息。session的使用之前在单体部分演示过,代码如下∶

@GetMapping("/setSession")
public Object setSession(HttpServletRequest request) {
    HttpSession session = request.getSession();
    session.setAttribute("userInfo","new user");
    session.setMaxInactiveInterval(3600);
    session.getAttribute("userInfo");
    // session.removeAttribute("userInfo");
    return "ok";
}

二、无状态会话

HTTP请求是无状态的,用户向服务端发起多个请求,服务端并不会知道这多次请求都是来自同一用户,这个就是无状态的。cookie 的出现就是为了有状态的记录用户。
常见的,ios与服务端交互,安卓与服务端交互,前后端分离,小程序与服务端交互,他们都是通过发起http来调用接口数据的,每次交互服务端都不会拿到客户端的状态,但是我们可以通过手段去处理,比如每次用户发起请求的时候携带一个userid或者user-token,如此一来,就能让服务端根据用户id或token来获得相应的数据。每个用户的下一次请求都能被服务端识别来自同一个用户。

三、有状态会话

Tomcat中的会话,就是有状态的,一旦用户和服务端交互,就有会话,会话保存了用户的信息,这样用户就”有状态”了,服务端会和每个客户端都保持着这样的一层关系,这个由容器来管理(也就是tomcat),这个session会话是保存到内存空间里的,如此一来,当不同的用户访问服务端,那么就能通过会话知道谁是谁了。tomcat 会话的出现也是为了让http请求变的有状态。如果用户不再和服务端交互,那么会话超时则消失,结束了他的生命周期。如此一来,每个用户其实都会有一个会话被维护,这就是有状态会话。
场景∶在传统项目或者jsp项目中是使用的最多的session都是有状态的,session的存在就是为了弥补http的无状态。

  • 注∶tomcat会话可以通过手段实现多系统之间的状态同步,但是会损耗一定的时间,一旦发生同步那么用户请求就会等待,这种做法不可取。

五、单Tomcat会话(图)

先来看一下单个tomcat会话,这个就是有状态的,用户首次访问服务端,这个时候会话产生,并且会设置jsessionid放入cookie中,后续每次请求都会携带jsessionid以保持用户状态。

谈一谈分布式会话

六、动静分离会话(图)

用户请求服务端,由于动静分离,前端发起http请求,不会携带任何状态,当用户第一次请求以后,我们手动设置一个token,作为用户会话,放入redis中,如此作为redis-session,并且这个token设置后放入前端cookie中(app或小程序可以放入本地缓存),如此后续交互过程中,前端只需要传递token给后端,后端就能识别这个用户请求来自谁了。

谈一谈分布式会话

七、集群分布式系统会话(图)

集群或分布式系统本质都是多个系统,假设这个里有两个服务器节点,分别是AB系统,他们可以是集群,也可以是分布式系统,一开始用户和A系统交互,那么这个时候的用户状态,我们可以保存到redis中,作为A系统的会话信息,随后用户的请求进入到了B系统,那么B系统中的会话我也同样和redis关联,如此AB系统的session就统一了。当然cookie是会随着用户的访问携带过来的。那么这个其实就是分布式会话,通过redis来保存用户的状态。

谈一谈分布式会话

八、类似关系∶局部变量与全局变量

Tomcat会话相当于一个类中某个方法的局部变量,只能在当前方法中使用;分布式会话相当于一个类中的公用全局变量,可以被类中诸多方法使用。如下代码∶

public class DistributedClusterTest {

    public String distributedSession ="global-1001";

    public void userSystem() {
        String userSession = "user-2001";

        System.out.println(distributedSession);
        System.out.printLn(orderSession);
    }

    public void orderSystem() {
        String orderSession = "order-3001";

        System.out.println(distributedSession);
        System.out.println(userSession);
    }
}

distributedSession是这个类中的全局变量,可以在其他的方法中被使用到,而 userSessionorderSession 是在方法中的局部变量,局部变量只能在本方法中使用,全局变量可以在其他方法里都能使用。那么分布式会话和单个tomcat会话其实也是一样的道理。

Original: https://www.cnblogs.com/reminis/p/16265294.html
Author: 小懒编程日记
Title: 谈一谈分布式会话

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/571470/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Nginx笔记

    文档可以参考淘宝的: 安装(CentOs7): /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http:/…

    Java 2023年5月30日
    057
  • JS特殊监听方法

    javascript;gutter:true; //监听元素变化classList //监听元素变化className //方法一 var tab2Interval = setIn…

    Java 2023年6月6日
    079
  • docker和docker compose安装使用、入门进阶案例

    一、前言 现在可谓是容器化的时代,云原生的袭来,导致 go的崛起,作为一名java开发,现在慌得一批。作为知识储备,小编也是一直学关于 docker的东西,还有一些持续继承 jen…

    Java 2023年6月15日
    073
  • 【特殊的阻塞队列】 java.util.concurrent.SynchronousQueue 源码分析

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    075
  • Spring系列11:@ComponentScan批量注册bean

    在前面的章节,我们介绍了 @Comfiguration和 @Bean结合 AnnotationConfigApplicationContext零xml配置文件使用Spring容器的…

    Java 2023年6月5日
    091
  • JAVA字符串格式化-String.format()的使用

    常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处。form…

    Java 2023年5月29日
    062
  • spring mvc 实战化项目之三板斧

    laravel实战化项目之三板斧 spring mvc 实战化项目之三板斧 asp.net mvc 实战化项目之三板斧 接上文希望从一张表(tb_role_info 用户角色表)的…

    Java 2023年5月30日
    0106
  • 企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像

    概述 在实际生产中,如果进行手动发布镜像到 Harbor,那么实在太 low 了。实际中,一般会结合 Jenkins 的流水线,进行自动构建和发布。 大致流程说明: 开发人员每天把…

    Java 2023年6月7日
    078
  • Java之Comparator使用举例

    简介 Comparator是一个比较器接口,位于java.util包下,用于排序和比较。 代码举例 import java.util.*; /** * @author &#xFF1…

    Java 2023年5月29日
    096
  • 各种查找算法的选用分析(顺序查找、二分查找、二叉平衡树、B树、红黑树、B+树)

    给你一组数,最自然的效率最低的查找算法是顺序查找——从头到尾挨个挨个遍历查找,它的时间复杂度为O(n)。 而另一个大家都知道的,效率很高经典查找算法——二分查找法,它的时间复杂度是…

    Java 2023年6月6日
    086
  • 各种锁

    只作一个浅显的解释作为区分,具体深入还请搜索相关博客。 可重入锁(又叫递归锁) synchronized(隐式&a…

    Java 2023年6月7日
    0105
  • mongodb 数据块的迁移流程介绍

    基本概念 1.1 Chunk(数据块) 表示特定服务器上面, 连续范围的分片键值所包含的一组数据,是一个逻辑概念。 例如,某数据块记录如下: { "_id" :…

    Java 2023年6月6日
    085
  • JAVA入门基础_从零开始的培训_Git入门使用

    Git概述及下载安装 集中式版本控制与分布式版本控制概述 Git下载与安装 Git常用命令 Git所覆盖的区域 全局用户名和邮箱、仓库状态、初始化、添加删除暂存区、提交到本地库、查…

    Java 2023年6月9日
    0115
  • 设计模式学习笔记(十六)迭代器模式及其在Java 容器中的应用

    迭代器(Iterator)模式,也叫做游标(Cursor)模式。我们知道,在Java 容器中,为了提高容器遍历的方便性,我们利用迭代器把遍历逻辑从不同类型的集合类中抽取出来,从而避…

    Java 2023年6月6日
    092
  • Java8新特性之Stream–Stream方法

    Stream主要有以下几种方法: 遍历/匹配(foreach/find/match)筛选(filter)聚合(max/min/count)映射(map/flatMap)归约(red…

    Java 2023年5月29日
    086
  • 实现艾尔登法环中的大卢恩效果

    使用顶点动画中的广告牌技术(Billboarding),来实现大卢恩在竖直方向上保持始终朝向玩家的效果。 1、广告牌技术原理 广告牌技术会根据视角方向来旋转一个被纹理着色的多边形,…

    Java 2023年6月9日
    0100
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球