Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 468|回复: 0

asp.net session的几种解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-7-11 17:17:08 | 显示全部楼层 |阅读模式

    简介

    SessionStateASP.NET默认的机制。SessionState有几种模式。InProcStateServerSqlServer模式。InProc不支持负载均衡的场景。只有StateServerSqlServer模式才支持。自定义模式是指我们自己实现Session数据的持久化,比如将Session数据放到Oracle数据库或者MySql数据库中,自定义模式也可以支持负载均衡。在StateServerSqlServer模式时,放入Session中的数据都必须是能序列化的。建议采用SqlServer模式的Session机制。

    默认模式

    默认模式下Session会在客户生成一个浏览器的cookie,跟在服务端生成一个内存对象。

    因为这种原理,所以当我们清理掉浏览器的cookie,再连接的时候,服务端还会生成一个新的Session对象,如果前个Session还没释放的话,就会有2个对象产生。

     

    cookieless模式

     

       <sessionState mode="InProc" cookieless="true" timeout="20" />

     

    cookieless会把SessionID通过Url的方式传递回去,这个url很难看,但是不需要在本地生成cookie

     

    将服务器Session信息存储在进程中(指aspstate进程,非iis进程)

     

      <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424"  cookieless="false" timeout="20" />

     

    这种方法,优点在于支持存入到别的服务器的进程中,不过需要存入的服务器装了.NET跟开启ASP.NET State Service的服务,但是这种方式也有一个缺点,就是内存占用加大,但是这是现在最完美的方案,因为我可以用别的机器去负载均衡Session的内存消耗,因为Session内存消耗是最大是6KB,但是默认哪怕你不存储也会消耗16B的默认内存,而WIN X86单个进程最大的内存使用是2GB,也就是如果服务器是X86系统,请慎用该模式。

     

     

     

    但是这种模式的好处是,只要存入到进程中,或者是别的机器的进程中,那么哪怕重启IISSession状态也不会丢失

     

    将服务器Session信息存储在数据库中

     <sessionState mode="SQLServer" sqlConnectionString="data source=127.0.0.1; user id=sa; password=sa" timeout="30" />

    打开Sqlserver的服务跟代理服务

    执行:C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallSqlState.sql

    会多一个aspstate的数据库

    注意:当我们开启SQLServer服务的时候全局文件里的Session_Star跟Session_End函数将失灵。

    这个时候再刷新现数据库中多了一条Session对象,这种方式存储比较合理,我们可以单独开一个服务器装数据库,然后作为Session专存的服务器

    而且我们就算重启服务器,也不会丢失Session数据,多个网站也可以共享Session状态。

     

    结论

     

    以上四种方式是微软给咱们建立的四种方式,各有优缺点,不是很推荐前两种方式,因为如果负载稍微大一点,会增加很大的服务器负担,第三种方式好处可见的,速度快,但是受限制于系统进程的要求,从综合效率上来说,第三种是最快的,但是如果服务器死机则数据清零

     

    第四种算是比较好的解决方案,我们可以开单独服务器存Session,但是如果你一台单独服务器都不存储Session的时候,我是说如果,这个需要很大的项目才会产生这种需求,那么可以考虑memcached存储Session对象,一个Session最大是6kb,memcached单个最大是1mb基本上是不用担心超出的,这样子可以提高更多的承载量,而相对于一些不太重要的数据,可以考虑cookie,这些数据如果全部存入Session,会带来不必要负担,设计犹如打太极拳,讲究是,效率,稳定,安全的均衡,没有完美的设置只有根据自己的需求的设计,才是最好的。

     

     

     

     

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-13 09:25 , Processed in 0.080743 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表