当前位置: 首页 > news >正文

.netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题

03393e4b161c01179625f5cff3b6b92f.png

一、我们知道Session的常见形式是会话cookie,即为设置过期时间的cookie,它的默认的生命周期为浏览器会话期间,一旦浏览器关闭窗口,这个cookie就消失了。其实现机制为:当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionID,如果不包含,则服务器会生成一个名为JSESSIONID的cookie返回到浏览器,(这个cookie存放在内存中,并不会存在硬盘)。同时在服务器端以HashTable的形式写到服务器内存中;当请求中包含sessionID时,服务器端会在HashTable中查找与该session相匹配的信息,若存在则直接使用该sessionID,否则重新生成新的session。

二、 Session共享:如果网站是存放在一台机器上,是不存在session共享这个问题的,因为所有的会话数据都在这一台机器上。但是,现在的网站大部分都是需要做负载均衡的,即需要把用户的请求分发到不同机器,当然这时会话ID在客户端是不存在问题的,但是服务端会出现取不到session数据的情况。如下图:

2930f0a8e09323cd39eb2a09e2ed2375.png

在该架构中,采用Nginx做负载均衡,两个Tomcat做后端服务器,假设当客户端第一次请求时,Nginx将其分发到了Tomcat1,这时候Tomcat1会产生sessionID返回给客户端,并同时保存在自己的内存中;当客户端第二次请求时,Nginx将其分发到了Tomcat2,这时便无法取到session。从而就会重新生成session,返回给客户端,并保存在自己的内存中。两台Tomcat中保存的同一个用户的session不同,这便是session的一致性问题。

为了解决这个问题,首当其冲,我会想到,将Tomcat1中的session复制到Tomcat2中即可,当然是可以的,但是不方便,因为这里只有两台服务器,而当后台服务器增多时,会很麻烦。从而,便有了如下的解决方法:

8489819f31effe85512f35766261b6db.png

即,将session分离出来,每个服务器都是从该session服务器(集群)中获取。这样以来,新增加的服务器也只需从session集群中获取。

(session集群可以通过memcached或redis来实现)

三、那么我们来看看ASP.NET Core使用Redis存储Session实现分布式共享?

Session 是客户端与服务器通讯会话跟踪技术,服务器与客户端保持整个通讯的会话基本信息。客户端在第一次访问服务端的时候,服务端会响应一个sessionId并且将它存入到本地cookie中,在之后的访问会将cookie中的sessionId放入到请求头中去访问服务器,如果通过这个sessionid没有找到对应的数据那么服务器会创建一个新的sessionid并且响应给客户端。

1、为什么要分布式共享Session? 

单服务器web应用中,session信息只需存在该服务器中,这是我们前几年最常接触的方式,但是近几年随着分布式系统的流行,单系统已经不能满足日益增长的百万级用户的需求,集群方式部署服务器已在很多公司运用起来,当高并发量的请求到达服务端的时候通过负载均衡的方式分发到集群中的某个服务器,这样就有可能导致同一个用户的多次请求被分发到集群的不同服务器上,就会出现取不到session数据的情况,于是session的共享就成了一个问题。这个时候就需要解决Session一致性。2、分布式Session存在的问题?
假设第一次访问服务A生成一个sessionid并且存入cookie中,第二次却访问服务B客户端会在cookie中读取sessionid加入到请求头中,如果在服务B通过sessionid没有找到对应的数据那么它创建一个新的并且将sessionid返回给客户端,这样并不能共享我们的Session无法达到我们想要的目的。

说白了一句话就是: 分布式Session存在会话不一致性的问题。 

3、分布式Session解决方案有哪些?

实现分布式session的方案非常多,选型时需要一种可靠、简单的实现方式,结合我们项目中的使用经验来看,使用基于Redis实现的分布式session方案还是比较靠谱的。

4a2d516800f69379f154727ff90cb320.png

dd620600c221035f10b62a14ce14276c.png

腾讯课堂

3957e16533eb9beae904793053a1a460.png

网易云课堂

b7af46103b26295769304e672f30c63d.png

ee9f69bfac6d93bbd3bfe5de28698190.gif

相关文章:

  • 检测代码检测到基于堆栈的缓冲区溢出_18000美金——Steam客户端缓冲区溢出的RCE
  • 不同系统下的shell的不同_绿雕景观在不同环境下的变化
  • 编写mapreduce程序实现对输入文件的词频统计排序_MapReduce实例分析:单词计数
  • laydate组件 无法传值_vue组件通信
  • python open文件_Python open()文件处理使用介绍
  • java教务管理系统数据库设计_[源码和文档分享]基于JAVA和SQL SERVER数据库实现的酒店管理系统...
  • 执行python代码的方式_用Python执行程序的4种方式,编程必备
  • WPS怎么统计相同名称的数据_教你如何将垃圾的WPS,玩得高大上!
  • vue radio双向绑定_Vue双向数据绑定,时间介绍,ref获取dom节点
  • 抓包实时打印_【硬货分享】 某网红打印机安全分析(下)
  • import pandas as pd 报错_Python数据处理,用pandas解决分段匹配,简单到没朋友
  • cricheditview实现语法高亮和行号_[源码和文档分享]基于VC++和QT实现的图的可视化工具...
  • table 内 下拉列表 被遮挡_Emacs Hack - 通过列表数据创建表格
  • 取出url中的字符_python爬虫,解决大众点评字符库反爬机制的经验
  • 单调有界定理适用于函数吗_实数系的连续性定理
  • $translatePartialLoader加载失败及解决方式
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Django 博客开发教程 16 - 统计文章阅读量
  • JavaScript-Array类型
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • MySQL用户中的%到底包不包括localhost?
  • PHP那些事儿
  • React+TypeScript入门
  • SQLServer插入数据
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vue:响应原理
  • web标准化(下)
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 推荐一个React的管理后台框架
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 选择阿里云数据库HBase版十大理由
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​2020 年大前端技术趋势解读
  • ​如何防止网络攻击?
  • $refs 、$nextTic、动态组件、name的使用
  • (arch)linux 转换文件编码格式
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (转)ObjectiveC 深浅拷贝学习
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转载)hibernate缓存
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .bat批处理(一):@echo off
  • .NET 分布式技术比较
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .Net面试题4
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • /bin/bash^M: bad interpreter: No such file or directory
  • @ModelAttribute注解使用
  • @NestedConfigurationProperty 注解用法