• 分布式session


    什么是session

     session的官方定义是:Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。

     说白了session就是一种可以维持服务器端的数据存储技术。session主要有以下的这些特点:

     1. session保存的位置是在服务器端

     2. session一般来说是要配合cookie使用,如果是浏览器禁用了cookie功能,也就只能够使用URL重写来实现session存储的功能

     3. 单纯的使用session来维持用户状态的话,那么当同时登录的用户数量较多的时候,或者存在较多的数量的session会导致查询慢的问题

     本质上:session技术就是一种基于后端有别于数据库的临时存储数据的技术

    分布式session实现方式

    • tomcat+redis方案
    1. 方便,但是与tomcat容器重耦合
    2. 使用 session 的代码,跟以前一样,还是基于 tomcat 原生的 session 支持即可,然后就是用一个叫做 Tomcat RedisSessionManager 的东西,让所有我们部署的 tomcat 都将 session 数据存储到 redis 即可。
    • Spring session+redis
    1. 给 sping session 配置基于 redis 来存储 session 数据,然后配置了一个 spring session 的过滤器,这样的话,session 相关操作都会交给 spring session 来管了。接着在代码中,就用原生的 session 操作,就是直接基于 spring sesion 从 redis 中获取数据了。

     session的必要性

    • 主要一个原因就是HTTP的无状态性

     因为HTTP的无状态性,所以我们没有办法在HTTP发送请求的时候知道当前用户的状态,也就是比如说,当前是哪个用户的之类的这种信息,所以这个时候我们需要session来标识当前的状态

    session原理机制

    1. 当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识- 称为session id
    2. 如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个)
    3. 如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,这个session id将被在本次响应中返回给客户端保存(通常保存到会话Cookie里)

    session工作原理

    通过一个模拟用户登录的流程图来初步理解session的原理,假设这个时候用户执行登录操作,具体的session工作流程如下:

    整个流程大概分成这样的几步:

    1. 第一步将本地的cookie中的session标识和用户名,密码带到后台中

    2. 第二步后台检测有没有对应的session标识,我们以php为例,那么就是检测有没有接收到对应的PHPSESSID

    3. 没有的话直接生成一个新的session。有的话,检测对应的文件是否存在并且有效

    3. 失效的话,我们需要清除session然后生成新的session。不失效,使用当前的session

    看到这里你可能对session的工作原理有一个初步的理解

    session的原理图如下:

     session的常见配置

    首先我们要在PHP的安装目录下面找到php.ini文件,这个文件主要的作用是对PHP进行一些配置。

      1. 设置session存放在cookie中中标识的字段名,php中默认为PHPSESSID

      对应的设置为:session.name = PHPSESSID

      2. 如果客户端禁用了cookie,可以通过设置session.use_trans_sid来使标识的交互方式从cookie变为url传递

        对应的设置为: session.use_trans_sid = 0

      3. 设置session的保存位置

      对应的设置是session.save_path="D:phpStudyPHPTutorial mp mp"

    session的一些相关注意事项

    1.关闭浏览器session同样存在

       如果我们没有人为的去设置cookie的生命周期的时候默认关闭浏览器session的状态是无法被保存下来的,因为没有设置cookie的生命周期,默认这个时候cookie为session cookie也就是在会话存在的时候cookie才有效,所以关闭浏览器cookie失效,导致后端拿不到对应的PHPSESSID,所以无法找到对应的session文件。

    2.session性能瓶颈怎样解决?

    如果是后端存在大量的session的时候,那么这个时候就会出现性能的瓶颈,例如:当后端同时存在有5000个session文件的时候,假设要找的文件是在第4999个,那么也就是说前面至少需要遍历4998次,这样就会浪费过多的时间在后端的循环遍历查找文件中,所以这个时候最有效的方法是使用redis,原理是通过将原本保存在本地的session文件写入到内存中,通过内存换空间的形式来达到提升速度。

    3. 一般不使用URL重写的方法来传递PHPSESSID

    其中主要有两个原因,一个是URL重写方式传递的话会导致URL混乱,影响美观。另一个是增大了用户误操作的几率。

  • 相关阅读:
    fs.mkdir
    Node Buffer 利用 slice + indexOf 生成 split 方法
    class 类
    Proxy + Reflect 实现 响应的数据变化
    ivew 封装删除 对话框
    php调用js变量
    JS调用PHP 和 PHP调用JS的方法举例
    curl远程传输工具
    php 正则只保留 汉字 字母 数字
    php 发送与接收流文件
  • 原文地址:https://www.cnblogs.com/dzlj/p/12219907.html
Copyright © 2020-2023  润新知